Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - Wednesday, July 23, 2008
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, June 03, 2008

Vatani görevimi tamamladım ve tekrar Bilge Adam'daki görevime geri döndüm.

Sorularınız ve görüşleriniz için yeniden yalcin.uzun@bilgeadam.com a mail atabilirsiniz...

Tuesday, June 03, 2008 5:58:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 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]    | 
Copyright © 2008 Yalçın Uzun