Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - DaatGridView'de Cross Page Posting
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]    | 
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):

Copyright © 2008 Yalçın Uzun