Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - Yazılım
Kişisel Blog
 
 Wednesday, July 23, 2008

Sayfalar arası veri transferinde QueryString ve Session’a güzel bir alternatif ASP.NET 2.0’da gelen CrossPage Posting’dir. Bu makalede cross page posting kullanarak DatagridView üzerinden başka bir sayfaya post yapmayı inceleyeceğiz.

Eğer cross page posting hakkında bir bilginiz yoksa bu makaleyi okumadan önce Ekin Özçiçekçiler’in makalesini okumanız faydalı olacaktır. ( http://www.yazilimuzmani.com/Articles/Details.aspx?aId=1000000795 )

Öncelikle iki sayfaya ihtiyacımız olacak:

1- Post yapacak sayfa. (Örnekte bir datagridview barındıran AktifBildirimlerim.aspx)

2- Post edilerek gönderilen datayı kullanacak sayfa. (Örnekte BildirimDetay.aspx)

AktifBildirimlerim.aspx sayfasında bulunan gridview’e post yapması için her satıra bir düğme eklememiz gerekiyor. (Buton,ImageButton vb..) OnClick olayını da ShowDetay adlı bir metoda bağlıyoruz.

<asp:TemplateField>

      <ItemTemplate>

        <asp:ImageButton ImageUrl="../Resimler/search.png" ID="MyGridLinkButton" runat="server" OnClick="ShowDetay"/>

       </ItemTemplate>

</asp:TemplateField>

 

Daha sonra ShowDetay metodunu yazmaya başlıyoruz.

    public void ShowDetay(object sender, EventArgs e)

    {

        //Grid'in hangi satırından geldiğini anlıyorum

        ImageButton btnEdit = sender as ImageButton;

        GridViewRow row = (GridViewRow)btnEdit.NamingContainer;

 

        //O satıra ait ID'yi DataKeys’den yakalıyorum

        int bildirimId= Convert.ToInt32(this.GridView1.DataKeys[row.DataItemIndex].Value);

       

        //Bu sayfada öbür tarafa göndermek istediğim veriyi bu class’ta oluşturduğum bir property’e aldım.

        //Bu değer istenirse bir label'a veya başka bir kontrole de atılabilir.

        //Böylelikle diğer sayfadan PreviousPage.FindControl diyerek değeri de alınabilir.

        this.BildirimId = bildirimId;

 

        //Sayfayı diğer bir sayfaya post etmek için Server.Transfer metodunu kullanıyorum.

        Server.Transfer("BildirimDetay.aspx", true);

    }

 

Bu sayfayla işimiz bitti. Şimdi BildirimDetay.aspx sayfasında yapmamız tek şey kaldı:

AktifBildirim.aspx sayfasında property kullandığım için bunu BildirimDetay.aspx’te class olarak göstermemiz gerekir. Çünkü PreviousPage özelliği geriye Page tipi döndürür.  Böyle olunca da onun üzerinden sayfadaki property’e erişemeyiz.    Bunun için BildirimDetay.aspx’e reference directive’ini eklemek gerekir.

<%@ Reference Page="~/BackOffice/AktifBildirimlerim.aspx" %>

Eğer bir sayfaya sadece tek bir sayfadan post geleceğinden eminseniz Reference yerine PreviousPageType directive’ini kullanmanız daha doğru olur. Bunu yaptığınızda  PreviousPage özelliği Page tipi değil, PreviousPageType’da belirttiğiniz sayfa tipinde döner. Böylelikle cast işlemine gerek kalmaz. Ancak bu yaptığımız örnekte, BildirimDetay.aspx’e birden fazla sayfadan post geleceği için ben Reference kullandım.

Eğer AktifBildirim.aspx sayfasında veriyi tutmak için property değil de kontrol kullansaydık buna gerek kalmayacaktı. PreviousPage.FindControl metodu ile veriye erişebilecektik.

Bütün hazırlıklarımız bittiğine göre artık kodumuzu yazabiliriz:

    protected void Page_Load(object sender, EventArgs e)

    {

        //Diğer sayfadan post olarak gelmişse gerekli işlemleri yapıyor.

        if (PreviousPage!=null)

        {

            //PreviousPage'den gelen sayfaya cast edip BildirimId'yi yakalıyorum.

            int bildirimId=(PreviousPage as BackOffice_AktifBildirimlerim).BildirimId;

           

            //Buralarda yakaladığım Id'yi kullanıyorum

            ucBildirimDetayAll1.BildirimId = bildirimId;

            ViewState["myID"] = ucBildirimDetayAll1.BildirimId;

            ucBildirimDetayAll1.Update();   

        }

    }

 

Her türlü sorunuz ve görüşünüz için çekinmeden yalcin.uzun@bilgeadam.com a mail atabilirsiniz.

Wednesday, July 23, 2008 1:50:15 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Wednesday, July 09, 2008

AJAX Tool Kit'te bulunan Modal PopUp kontrolünü kullanmışsanız bilirsiniz ki, göstermek istediğiniz panel kontrolü (veya div, artık ne kullanmışsanız) sayfa yüklenirken bir kaç saniye ekranda kalır. Bu da kötü bir görüntüye sebep olur. Bu durumdan kurtulmanın çözümü gayet basit:

Tek yapmanız gereken panel'e style="display:none" attribute'unu eklemek.

Cümle içinde kullanmak gerekirse:

<asp:Panel style="display:none" ID="myModalPop" runat="server">Burası artık açılışta gözükmeyecek</asp:Panel>

 

Wednesday, July 09, 2008 1:38:10 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Tuesday, October 09, 2007

İlk Visual Studio AddIn Projem.

Oracle JDeveloper ‘da bulunup gıpta etttiğim bir özelliğin addin’ini yazdım.

Kod sayfasında addini çalıştırdığınızda tüm global değişkenleri listeliyor.
Daha önce property’ye dönüşmüş olanlar varsa onları listeden çıkartıyor.

Siz sadece set ve get’lerden istediklerinizi seçiyorsunuz. Propertylerini addin yazıyor.

Daha önce AddIn projesi yapmamış olanlar için ve DTE namespace’i  (macrolarda da kullanılan) için güzel bir örnek.
Ayrıca regular expression kullanımı için de örnek teşkil edebilir. (değişken tanımlamalarını ve property’leri bulmak için kullandım)

Şu an üşengeçlikten desteklemediğim şeyler:
VB dili
int x=4; gibi bir değişken tanımlama.
hede x=new hede(); gibi bir değişken tanımlama.


Onun dışında gayet güzel çalışıyor. (En azından bende)

Kolay gelsin...
Yalçın








İndirmek için tıklayınız: YalcomaniaPropertyBuilderAddIn.rar (62,38 KB)
Tuesday, October 09, 2007 4:10:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Monday, October 08, 2007

Bir projemde Regular Expression kullanmam gerekti. Ancak piyasadaki uygulamalar tüm diller için yazıldığı için orada düzgün çalışan expression'lar .net'e gelince çalışmıyordu. Bunun üzerine oldukça basit olan bu uygulamayı yazdım.



İndirmek için tıklayınız: Yalcomania_RegEx_Editor.rar (44,51 KB)
Monday, October 08, 2007 1:27:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Monday, October 01, 2007

Eğlencesine yazdığım bir oyun. (Kantina'daki makina çok paramı yedi de)

İncelemek için güzel bir örnek olabilir. Kapsadığı konular:

Temel OOP
Eventler'le çalışmak
IComparable Interface'i
User Controllerle çalışmak
Gerçekten Random çalışan class
Gömülü kaynaklarla çalışmak
Backgroundworker nesnesi ile çalışmak
Gradient Form
Hazır İskambil kağıdı kütüphanesi (Kart, EldekiKartlar ve Deste classları)
Web Cam (veya bir capture device ile) görüntü capture etmek
Observer Design Pattern

İndirmek için: YalcomaniaHorseRacePoker.rar (1,32 MB)

Screen Shotlar:





İndirmek için : YalcomaniaHorseRacePoker.rar (1,32 MB)
Monday, October 01, 2007 9:24:25 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Wednesday, September 19, 2007

İki adet formula field'a ihtiyacımız olacak:
Adlarını koymak size kalmış.

Birincisi:
WhilePrintingRecords;
Global numberVar total;
total:=total+{Orders.Freight} Burada toplamını istediğimiz alanı yazıyoruz. Ben orders tablosundaki Freight'i aldım.

Türkçe meail:
Her kayıtta "total" adlı global bir değişkene, freight'tan gelen değeri ekle.

Bu formülü kaydedip kapattıktan sonra Details kısmına bırakıyoruz.  Böylelikle her kayıt geldiğinde sürekli artan bir değişkenimiz var.
Şöyle bir şey oluyor:

Order Id:   Freight:    BenimFormul:
1                 10                10
2                 25                35
3                 100               135

Tabi, bu formülün ekranda gözükmesini istemeyiz, o yüzden alanı seçip suppress özelliğini true yapıyoruz.

Görecekseniz ki kaç sayfa olursa olsun alanımız giderek artacak. Bu yüzden sayfa başında sayac'ı sıfırlamamız lazım.

İşte ikinci formül kodlarımız:

WhilePrintingRecords;
Global numberVar total;
numberVar geciciDegisken:=total;
total:=0;
geciciDegisken;

Türkçe meail:
total adlı global değişkendeki değeri, geciciDegisken adlı bir değişkene aktar.
global değişkeni sıfırla
ekrana geciciDegiskenin değerini bas

Bu formülü de Page Header'a koymamız lazım. Böylelikle her sayfa oluşturuluken burası sadece bir kere çalışacak. değeri de sıfıladığımız için bir önceki formül toplamaya 0'dan başlayacak.


 

Wednesday, September 19, 2007 11:53:02 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Tuesday, September 18, 2007

Herhalde Crystal Report hakkında forumlarda en faza sorulan sorulardan biri de veritabanında sadece yolu tutulan bir resmin raporda gösterilmesidir. Aslında sorun şurdan kaynaklanıyor; Crystal, database’de binary olarak saklanan resimleri direk gösterebiliyor ancak yolu verilen bir resmi binary formata çevirip gösteremiyor. Her ne kadar sorun olsa da çözüm imkansız da değil. Bu makalede kendi Typed Dataset’imizle bu sorunu nasıl aşacağımız anlatacağım.

Önce kendi veritabanımızı oluşturarak işe başlayalım. Ben örnekte “Oyuncular” diye bir tablo oluşturup , ünlü sinema oyunularımızla doldurdum. Bu sanatçıların resimlerini de C klasörünün altında Resimler adlı bir klasöre attım. Bu resimlerin adlarını da tabloya girdim.



Daha sonra CrystalResim adlı bir Windows Projesi oluşturdum. Form1’ime Crystal Report Viewer nesnesi ekledim.

Bir sonraki adımda bir “typed dataset” olarak oluşturup, bunu ilgili tablomuz gelecek şekilde dolduracağız ve daha sonra binary resimlerimizi ekleyeceğimiz bir sütun oluşturacağız. Bunu yapmaktaki amacımız bu dataset’i raporumuza kaynak olarak vermemiz. Adım adım bu işlemleri gerçekleştirelim:

1-      Typed Dataset’i oluşturmak için, projemizde sağ tık ve “Add New Item” seçeneğinden Dataset’i seçiyoruz. Ben ismine “MyDataSet” verdim. Bu isim önemli çünkü ileride NameSpace olarak karşımıza çıkacak.

2-      Bize boş bir ekran geliyor. İster Server Explorer’dan Oyuncular Tablosunu buraya sürükleyip bırakın, isterseniz sağ tık à “Add”  à Table Adapter seçeneğini seçip, buradaki sihirbazı takip edebilirsiniz. Otomatik olarak Visual Studio bu TableAdapter’e bir isim verecektir. (Tablo Adı + “TableAdapter” şeklinde). Bu isim önemli çünkü örneğimizin ilerleyen zamanlarında kullanacağız.  Sonuçta şu şekilde bir yapı elde etmeniz lazım:



3-      Sırada resmi binary olarak aktaracağımız sütunu eklemek var. Tablo üzerinde sağ tık à Add à Column seçeneği ile yeni bir sütun oluşturacağız. Yeni sütuna ben “BinaryResim” adını verdim. Bu işlemden sonra sütunu seçip “Properties” ekranından DataType seçeneğini System.Byte yapın. Ancak biz tek bir byte değil, byte dizisi tutacağımız için sonuna [] karakterlerini ekleyin. Yapının son hali şu şekilde olması lazım:

 

4-      Bu ekranla işimiz bitti. Projeyi bir kere derleyip bu ekranı kapatabiliriz. Derlemezseniz rapor ekranında sorun yaşayabilirsiniz.

Şimdi rapor oluşturma kısmına geldik. Projemiz üzerinde sağ tık à Add New Item à Crystal Report seçeneği ile bu işlemi gerçekleştirebiliriz. Ben rapor adına rprOyuncular dedim.  Bildiğiniz üzere bizi Crystal’ın sihirbazı karşılayacaktır. Raporu ister sihirbazla, isterseniz “As A Blank Report” seçeneğini seçip elle de yapabilirsiniz.

Sihirbazla yapacaksanız, ilk ekranda kaynak olarak  Project Data à Ado.Net Data Sets à Crystal Resim.MyDataSet (Dikkat ederseniz burasu Proje adı nokta dataset adı şekline gidiyor) à Oyuncular (Tablonun adı) seçmelisiniz.

Elle yapacaksanız Field Explorer’da Database Fields à sağ tık à Database Expert seçeneğini seçip bir sonraki adımda sihirbazdaki şablonu uygulamalısınız.

Sihirabazla devam edenler bilirler ki, bundan sonraki adım rapora dahil edilecek alanları seçmektir.  Bu ekranda BinaryResim olarak kendi oluşturduğunuz alanı göremeyeceksiniz. Sakin paniklemeyin, her şey yolunda. Sadece o sütunun tipi byte[] olduğu için listede çıkmadı. O alan yokmuş gibi rapor işlemlerinize devam edin.

Elle devam edenler ise bir problem yaşamayacaklar, çünkü tüm sütunlar karşılarında çıkacak ve sürükle bırak işlemi ile istenilen sütunları rapora atacaklardır.

Wizard ile işlemlerini tamamlayan arkadaşlar BinaryResim alanını rapora eklemek için Field Explorer’dan BinaryResim sütununu elle sürükleyip bırakacaklar, böylelikle iki üst paragrafta bahsettiğim sorunu çözeceklerdir.

DİKKAT: BinaryResim  sütununu rapora eklemezseniz resimler gözükmeyecektir. Resim adlı sütun sadece resim dosyasının adını tutuyor.

Artık raporumuz da bitti. Tek yapmamız birazcık kod yazmak. Formumuzda hatırlayacağınız gibi bir tek Crystal Report Viewer nesnesi vardı. Bu yüzden kodlarımı Form’un Load olayında yazacağız.

        private void Form1_Load(object sender, EventArgs e)

        {

            //Dataset'imizin bir instance'ını oluşturacağız (daha doğrusu sadece tablomuzu oluşturacağız)

            myDataset.OyuncularDataTable oyuncularTablo = new myDataset.OyuncularDataTable();

 

            //Datatable'ımızı dolduracak TableAdapter'i de oluşturuyoruz

            myDatasetTableAdapters.OyuncularTableAdapter oyuncularTableAdapter = new CrystalResim.myDatasetTableAdapters.OyuncularTableAdapter();

 

            //Verilerle dolduruyoruz

            oyuncularTableAdapter.Fill(oyuncularTablo);

 

            //!!!!İşin can alıcı noktası burada. DataTable'daki her satırı dolaşarak Resim alanındaki resmin binary

            //halini BinaryResim alanına aktarıyruz

            foreach (DataRow dr in oyuncularTablo.Rows)

            {

                byte[] resim= System.IO.File.ReadAllBytes(@"c:\Resimler\" + dr["Resim"].ToString());

                dr["BinaryResim"] = resim;

            }

 

            //Rarpoun bir instance'ını oluşturuyoruz

            rprOyuncular oyuncularRapor = new rprOyuncular();

 

            //Raporun kaynağını datatable'ımız olarak veriyoruz

            oyuncularRapor.SetDataSource(oyuncularTablo as DataTable);

 

            //ve en son formda görmek için Crystal Report Viewer nesnemizi rapora bağlıyoruz

            this.crystalReportViewer1.ReportSource = oyuncularRapor;

 

        }

Bu kadar!!! Artık tek yapmanız gereken projeyi çalıştırmak. Görünüm şu şekilde olacaktır:

 

Bir makalenin daha sonuna geldik. Umarım raporlarda resim göstermekte zorlanan arkadaşlar için yararlı olmuştur. Tüm görüş, düşünce ve sorularınız için çekinmeden yalcin.uzun@bilgeadam.com ‘a mail atabilirsiniz.

 

Projeyi, resimleri ve veritabanını indirmek için : CrystalResimMakale.rar (211,22 KB)
Tuesday, September 18, 2007 5:51:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Monday, September 17, 2007

Ne yalan söyleyeyim, çok kolaymış.

Bir tema yaratıp, içindeki skin dosyasına aşağıdaki gibi stillerinizi oluşturun:

<
asp:GridView SkinId="Sari" runat="server" BackColor="yellow" BorderColor="yellow" />

<asp:GridView SkinId="Kirmizi" runat="server" BackColor="red" BorderColor="red" />

<asp:GridView SkinId="Yesil" runat="server" BackColor="green" BorderColor="green"/>

Sonra bu sayfayı kaydedin. (Kaydetmezseniz listede göremezsiniz)

Grid koyduğunuz sayfanın page directive'ine StyleSheetTheme (Dikkat, "theme" değil) attribute'ine temanızın adını verin.

Artık gridview'in smart tasks panelindeki AutoFormat özelliğinde stillerinizi görebilirsiniz.

Monday, September 17, 2007 7:07:31 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 

Örnek üzerinden gidelim:

BenimTema adlı bir tema'mız var ve altındaki skin dosyasında şu satır yazılı:

<
asp:Button runat="server" BackColor="Red" /> (Butonların arka planını kırmızı yap)

Sayfamızda şöyle bir buton olsun:

<
asp:Button ID="Button1" runat="server" Text="Button" BackColor="black" /> (Arka planı Siyah olan bir buton)

Page directive'miz de şöyle:

<%@ Page StylesheetTheme="BenimTema" %>

Bu kod çalıştığında buton'umuzun rengini siyah olarak görürüz. (Kontrol'deki renk)

Page directive'i şöyle değiştirdiğimizde ise:

<%@ Page Theme="BenimTema" %>

buton'umuzun rengini kırmızı olarak görürüz. (Tema'daki renk)

Yani bir kontrolde görsel bir değişiklik tanımlanmışsa ve o özellik sayfanın kullandığı temada da varsa:
-Theme kullanıldığında Tema'daki değer baskın olur
-StyleSheetTheme kullanıldığında kontrolün değeri baskın olur.

Monday, September 17, 2007 6:41:52 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Tuesday, September 04, 2007

Javascript debugging'i sadece VS 2008'e has bir özellik olduğunu sanan arkadaşlara VS 2003 veya 2005'te

1- Internet explorer'ın ayarlarından Disable Javascript Debugging seçeneğini kaldırmalarını
2- debug etmek istedikleri javascript kodunda breakline için debugger yazmalarını

hararetle tavsiye ederim.

Tuesday, September 04, 2007 12:53:37 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Friday, August 03, 2007
ASP.Net'te TreeView nesnesine sonsuz ağaç yapısındaki verilerinizi mi atmak istiyorsunuz? İşte cevabı:
(Aynı zamanda güzel bir recursive method örneği)

Kategoriler Tablosu:
KategoriId - int
Kategori Ad - varchar(50)
UstKategoriId - int (Nullable)

Bu tabloda KategoriId ve UstKategoriId arasında da ilişki var.


public partial class Default3 : System.Web.UI.Page

{

//Kategoriler tablosunun duracağı dataset. Her iki metoddan da ulaşılcağı için global yaptım.

DataSet ds = new DataSet();

protected void Page_Load(object sender, EventArgs e)

{

//Treeview'imizin node'larını oluşturmaya başlıyoruz

TreeViewNodlariniOlustur();

}

private void TreeViewNodlariniOlustur()

{

//Treeview'i önce temizleyelim

this.TreeView1.Nodes.Clear();

//Standart database kodları, amaç tüm kategoriler tablosunu bir dataset'e atmak

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyWebSiteDBConnectionString"].ConnectionString);

SqlDataAdapter da = new SqlDataAdapter("select * from kategoriler", con);

da.Fill(ds);

//Önce en üst kategorileri yazdırmalıyız. Bu da üst kategoriId'si null olan kayıtlar demektir.

DataRow[] anaKategoriler = ds.Tables[0].Select("UstKategoriId is null");

//Şimdi hepsini dolaşmaya başlıyoruz

foreach (DataRow anaKategori in anaKategoriler)

{

TreeNode tn = new TreeNode(anaKategori["KategoriAd"].ToString(), anaKategori["KategoriId"].ToString()); //Birinci parametre Text, ikinci parametre Value

this.TreeView1.Nodes.Add(tn); //Treeview'e ekliyoruz

//Yazdığımız her kategorilerinin altında başka kategoriler var mı diye tek tek kontrol ediyoruz

AltKategorileriYaz(tn, Convert.ToInt32(anaKategori["KategoriId"]));

}

}

//Cillop gibi recursive method'umuz

private void AltKategorileriYaz(TreeNode ustKategori, int kategoriId)

{

//Parametreden aldığımız kategori'nin altındaki altkategorileri sorguluyoruz

DataRow[] kategoriler = ds.Tables[0].Select("UstKategoriId=" + kategoriId);

//Her alt kategoriyi dolaşmaya başlıyoruz

foreach (DataRow kategori in kategoriler)

{

TreeNode tn = new TreeNode(kategori["KategoriAd"].ToString(), kategori["KategoriId"].ToString());

//Olulan yeni node'u, parametre olarak gönderdiğimiz node'a bağlıyoruz.

ustKategori.ChildNodes.Add(tn);

//ve bu kategorinin de altında alt kategoriler var mı diye kendimizi tekrar çağırıyoruz.

AltKategorileriYaz(tn, Convert.ToInt32(kategori["KategoriId"]));

}

}

}

Friday, August 03, 2007 2:57:12 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Friday, June 22, 2007

Bir projemde lazım olmuştu. Belki sizin de işinize yarar:


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)

{

e.Graphics.PageUnit = GraphicsUnit.Millimeter;

//Print kodları

}

Friday, June 22, 2007 1:54:58 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Tuesday, June 12, 2007

Site içinde arama yapmak için Google'ın beta aşamasında olan harika bir toolu'u var.
Hararetle tavsiye ederim:
http://www.google.com/coop/

Sitemde arma yaparak neye benzediğini görebilirsiniz.
Ancak bu sitenin kodları hazır olduğu için javascript'le ekledim.

Daha güzeli ve customize edilmiş hali için:
http://www.csharpnedir.com a bakabilirsiniz.

Asp.net sitenize de böyle entegre edebilirsiniz:
http://www.codeproject.com/useritems/CustomSearchEngine.asp


Tuesday, June 12, 2007 1:29:37 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Monday, June 11, 2007

Çok basit bir yöntem. İki de bir unuttuğum için, bakayım diye buraya yazıyorum:

select top X * from Tablo order by newId()

X= kaç kayıt getirmek istediğin

Monday, June 11, 2007 5:24:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Wednesday, June 06, 2007

Nhibnernate'i webde kullanırken güvenlik ayarlarından dolayı oldukça zorluk çektim.
godaddy'de host edilen web projem sürekli izinlerden dolayı çatlıyordu.

Uzun araştırmalardan sonra web config'i aşağıdaki gibi düzenleyerek bu hatalardan kurtuldum.

Önemli olan nokta "nhibernate" adlı bir configsection açılması ve reflection kullanımının kapatılması. Aynı satır nhibernate-configuration section'unda olursa yine çalışmıyor.

      <configSections>

            <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" requirePermission="false"/>

            <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>

             </sectionGroup>

      </configSections>

      <nhibernate>

            <add key="hibernate.use_reflection_optimizer" value="false"/>

      </nhibernate>

      <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

            <session-factory>

                  <property name="hibernate.dialect">NHibernate.Dialect.MsSql2005Dialect</property>

                  <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

                  <property name="connection.connection_string">server=.;database=XXXX;User ID=XXX;Password=XXX;</property>

                  <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

            </session-factory>

      </hibernate-configuration>

 

Wednesday, June 06, 2007 8:01:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Tuesday, June 05, 2007

Projelerimde çok fazla kullandığım ve yazmayı tam anlamıyla amelelik gördüğüm bir şey için bir makro yazdım, sizinle de paylaşmak istedim.

Genellikle formlarımın load'unda:

gibi textbox, datetime picker gibi kontrolleri dolduran bir kod oluyor:

Şekil 1-A:

            this.textBox1.Text = h.Ad;

            this.textBox2.Text = h.Soyad;

            this.textBox3.Text = h.Email;



Bir de Kaydetme işini yapan butonun altında da şöyle kodlarım oluyor:

Şekil 1-B:

                  h.Ad=this.textBox1.Text;

                  h.Soyad=this.textBox2.Text;

                  h.Email=this.textBox3.Text;


İşte bu makro bu ikisini birbirine dönüştürüyor. Yani doldurmayı, atamaya ve atamayı doldurmaya çeviriyor. Tür dönüşümü vs gibi işlemler için hiç bir önlem almadım, ancak bu işlem bile benim işlerimi oldukça kolaylaştırdı.

Mantığı oldukça basit. Eşittir gördüğü satırı Split fonksiyonu ile parçalıyor. Sonundaki noktalı vürgülü kaldırıyor. Bir sonraki aşamada parçaladığı yerleri değiştirirek ve sonuna noktalı vürgül atıyor. Bunu ekrana yazıyor.

Dosya "vb" uzantılı. Bunu eklemek için bir notepadde açın, içeriği kopyalayın. Visual Studio'da Macro Explorer'da yeni bir modül yaratın. Adını "TersCevir" koyun. (Büyük harf küçük harf duyarlı) Çift tıklayıp, içeriği yapıştırın.

Çalıştırmak için ters çevirmek istediğiniz kodları işaretleyip, makro menüsünden TersCevir'i çift tıklamanız yeterlidir.

Afiyet olsun.


TersCevir.zip (760 Byte)
Tuesday, June 05, 2007 11:22:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 

Bir projemde şöyle bir senaryo ile karşılaştım.
Kullanıcı kendisi ile ilgili açılan bir bölüme, başkasının görmemesi gereken dosyaları upload etmesi gerekiyordu.
Aynı şekilde site yöneticisi de bu kişi adına oraya dosya atabilmeliydi. Ancak dediğim gibi bu dosyanın başkası tarafından görülmemesi çok önemliydi.

Response.redirect'le veya bir link vererek bu işi yapamazdım, çünkü browser'ın history'sinde kaldığı için aynı makinaya oturan bir başkası o linki tıkladığında dosyayı indirebilirdi.

İnternette bulduğum şu yöntem çok hoşuma gitti:


public class FileManager

{

    public static void DownloadFile(int FileId)

    {

 

        MyClass.Entity.File f = (MyClass.Entity.File)Facade.Dosya.GetById(FileId).File; //Burası önemsiz, dosya bilgileri
        //f.Name'de dosyanın GUID isimle kaydedilmiş hali var, OriginalName özelliğinde ise dosyanın orjinal adı var (a.jpg gibi)

        System.IO.FileStream fs= System.IO.File.Open(System.Web.HttpContext.Current.Server.MapPath(@"~/Files/"+f.Name),System.IO.FileMode.Open);

        byte[] bytes = new byte[fs.Length];

        fs.Read(bytes, 0, (int)fs.Length);

        fs.Close();

        System.Web.HttpContext.Current.Response.AddHeader("Content-disposition","attachment; filename="+f.OriginalName );

        System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

        System.Web.HttpContext.Current.Response.BinaryWrite(bytes);

        System.Web.HttpContext.Current.Response.End();

    }

}