GridView – Silme ve Güncelleme İşlemlerindeki Hataları Yönetmek

Bildiğimiz gibi GridView kontrolünü DataSource kontrolleri aracılığıyla veriye bağladığınızda eğer istenirse Update ve Delete sorguları da oluşturulabiliyor. Bu sorgulardan yola çıkarak tek satır dahi kod yazmadan listelenen kayıtlar üzerinde güncelleme ve silme işlemleri yapabiliyoruz. Herşeyin otomatik olduğu böyle bir ortamda bazen hesapta olmayan(aslında veritabanı tasarımında hesaplanan, yani aslında hesapta olması gereken) sorunlarla da karşılaşabiliyoruz. Ne gibi sorunlar derseniz; örneğin listelediğimiz kayıtlardan bir tanesini silmek istediğimizde eğer farklı bir tabloda bu kayıda bağlı başka satırlar varsa(constraint ile silinmesi kısıtlanmışsa) silme işlemi hataya yol açacaktır. Yine güncelleyeceğiniz satırın bir alanına hatalı bir veri girişi yaparsak(null değer almayan bir alanı boş bırakmak gibi) başka bir hata ile karşılaşırız. Bu tip durumlarda iki farklı çıktı ile karşılaşabiliriz, eğer özel hata sayfalarını aktifleştirmemiş ve debug modda çalışmayı kapatmadıysak doğrudan üretilen SqlException tipindeki hata mesajını, ya da özel hata sayfalarını aktifleştirdiysek hata sayfamıza yönlendiriliriz. İlk durumdaki hata çıktısı eminim ki sizlere pek yabancı gelmeyecektir(buyrun resime bakalım)

Bu sayfadan özel hata sayfalarını aktifleştirirsek kurtulabiliriz. Ancak bu hata sayfaları projemizin genelinde görüntüleneceği için GridView’da oluşan hatalar için kendimiz farklı bir hata sayfası tasarlamak isteyebiliriz. Böylece burada alınan SqlExcpetion tipindeki hatayı kullanıcıya görüntüleyerek ne tarz bir hata yapıldığı konusunda daha doyurucu bir bilgi sunabiliriz. GridView üzerinde bir işlem yapılırken çalışma zamanında oluşan bir hatayı yakalamak istiyorsak sayfamızın Error eventi için yazılabilecek Page_Error metodunu kullanabilir veya yine sayfada yer alan OnError isimli virtual metodu ezebiliriz(override edebiliriz). Aklımıza, GridView’ın kendine özel bir hata eventi yok mudur sorusu gelebilir, cevabını hemen vereyim maalesef yoktur:) O zaman parmaklarımızı hazırlıyoruz ve klavyemizden aşağıdaki sihirli kodları yazıp neler olacağına göz atıyoruz.

Default.aspx (RowDeleting ve RowUpdating eventlerini metotlarına bağlıyoruz)

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

    DataKeyNames="ProductID" DataSourceID="SqlDataSource1"

    onrowdeleting="GridView1_RowDeleting" onrowupdating="GridView1_RowUpdating">


Default.aspx.cs

private string command; //Islem tipini saklamak icin

 

//Sayfada hata olustugunda OnError metodu tetiklenir

protected override void OnError(EventArgs e)

{

    base.OnError(e);

 

    //Olusan son hatanin mesaj bilgisini aliyoruz

    string errorMessage = Server.GetLastError().Message;

    if (command == "Delete")

        Session["gridHata"] = "Silme işleminde hata! Hata mesajı: " + errorMessage;

    else if (command == "Update")

        Session["gridHata"] = "Güncelleme işleminde hata! Hata mesajı: " + errorMessage;

    Server.Transfer("Hata.aspx");

}

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

{

    //Islemin tipini Delete olarak belirleyip Session'a null degerini atiyoruz

    //Silme islemi basarili olursa Session'daki deger silinecek

    command = "Delete";

    Session["gridHata"] = null;

}

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

    //Islemin tipini Update olarak belirleyip Session'a null degerini atiyoruz

    //Guncelleme islemi basarili olursa Session'daki deger silinecek

    command = "Update";

    Session["gridHata"] = null;

}

 

Neler yaptığımızı özetleyecek olursak; GridView1_RowDeleting ve GridView1_RowUpdating metotlarında yapılan işlemin tipini saklayıp Session nesnesinin içeriğini boşalttık. Ezdiğimiz OnError metodunda ise oluşan hatanın mesajını alıp Session’a kaydettik, ardından da talebi Hata.aspx adındaki bu iş için oluşturacağımız hata sayfasına yönlendirdik(Server.Transfer ile yönlendirmemizin sebebi URL satırında hala Default.aspx’in saklı kalmasını sağlamak. Çok kritik bir durum değil, Response.Redirect ile de yönlendirme yapılabilir) Hata.aspx sayfamızın da Page_Load metodunda Session bilgisine bakarak ekrana hatayı yazdırdığımızda artık senaryomuz çalışır hale gelecektir.

Hata.aspx

protected void Page_Load(object sender, EventArgs e)

{

    if (Session["gridHata"] != null)

        Response.Write(Session["gridHata"].ToString());

 

    Session["gridHata"] = null;

}

10 Temmuz 2009 Cuma 23:36

Yorum - RSSYorumlar (1)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ListView’da Sayfalama İşlemini QueryString ile Gerçekleştirmek

ASP.NET 3.5 ile gelen veri kontrolü ListView oldukça esnek bir yapı sunmaktadır. GridView ile yapılabilen tüm işlemleri gerçekleştirebildiğimiz bu kontrolde GridView’a ek olarak Insert işlemlerini de yapabiliyoruz. Diğer yandan oluşacak HTML çıktıda tamamen bizim elimizde, yani istediğimiz şekilde HTML çıktıyı oluşturabiliyoruz. GridView’da bu tarz bir işlemi yapmak neredeyse imkansızdı.

ListView’ın bir diğer avantajı ise sayfalama(paging) işlemlerini QueryString üzerinden yapıyor olabilmemiz! ListView kontrolü sayfalama işlemlerini DataPager adındaki bir kontrol üzerinde yapmaktadır(DataPager’ın da ASP.NET 3.5 ile geldiğini belirtmek gerekir). Normal şekilde oluşturulan ListView kontrolü sayfalama işlemlerini DataPager içerisindeki LinkButton’lar ile yapar; yani PostBack işlemi sonucunda çağrılan JavaScript fonksiyonları sayfalamanın yapılmasına yardımcı olur. Dolayısıyla sayfanın URL’sinde herhangi bir değişiklik olmaz. Eğer sayfalama işleminin QueryString üzerinde taşınan SayfaNo gibi bir değer ile UrunListele.aspx?SayfaNo=3 şeklinde gerçekleşmesini istiyorsak yapmamız gereken tek şey DataPager kontrolünün QueryStringField özelliğine SayfaNo gibi bir değer atamak olacaktır. Yine elimiz değmişken şu özellikten de bahsedeyim; DataPager’ın PageSize özelliğinden de bir sayfada kaç kayıt görüntüleneceğini belirleyebilirsiniz. Aşağıda DataPager üzerinde yapılan değişiklikler ve örnek bir ekran çıktısı yer alıyor.

<asp:DataPager ID="DataPager1" runat="server" QueryStringField="SayfaNo" PageSize="15">

    ...

</asp:DataPager>

Kullanıcıların QueryString üzerinden istediği sayfalara gidebilmesi ve arama motoru iyileştirmesi(SEO) açısından oldukça önemli ve kullanışlı bir ipucu aslında ;)

30 Mayıs 2009 Cumartesi 11:52

Yorum - RSSYorumlar (4)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

GridView'e Programatik Veri Bağlamada Sayfalama ve Sıralama İşlemleri

GridView'e programatik olarak veri bağladığında eğer sayfalama(paging) ve sıralama(sorting) işlemi yapılırsa gridin bu işlemlerini ne şekilde yapacağını da yine programatik olarak belirlemek gerekecektir. Sayfalama işlemi için PageIndexChanging, sıralama işlemi için ise Sorting evetleri kullanılmaktadır. Sayfalama işlemi için yazılacak event metodunda yapılacak işlemler gridin yeni sayfa indeksini belirlemek iken, sıralama işleminde durumlar biraz daha karışıktır. Sorting event'i tetiklendiğinde grid kontrolü her defasında sıralama yönünü Ascending olarak getireceği için kullanıcının tersten sıralama (Descending) işlemi yapması durumunda bizim ekstra kodlarla bu durumu ele almamız gerekecektir. Burada sıralama yönünü geçici olarak bir yerde depolamak gerekecektir ki; en uygun yerin ViewState olduğunu söyleyebilirim. Aşağıdaki kodlarda gridview kontrolünün sayfalama ve sıralama işlemlerini nasıl ele alabileceğimiz görüntülenmektedir. Yorum satırları size yardımcı olacaktır.

void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

{

    // e parametresinden gelen index numarasını gridview'ın PageIndex'ine atayıp

    // verileri tekrar bağlamak sayfalama işlemi için yeterli olacaktır

    GridView1.PageIndex = e.NewPageIndex;

    GridView1.DataBind();

}

 

void GridView1_Sorting(object sender, GridViewSortEventArgs e)

{

    // İlk sort işlemi yapıldığında çalışır

    if (ViewState["siralananKolon"] == null)

    {

        ViewState.Add("siralananKolon", e.SortExpression);

        ViewState.Add("siralamaYonu", "ASC");

    }

    else

    {

        // Aynı kolon 2. kez sıralandığında çalışır

        if (ViewState["siralananKolon"].ToString() == e.SortExpression)

        {

            if (ViewState["siralamaYonu"].ToString() == "ASC")

                ViewState["siralamaYonu"] = "DESC";

            else

                ViewState["siralamaYonu"] = "ASC";

        }

        // Farklı bir kolon sıralandığında çalışır

        else

        {

            ViewState["siralananKolon"] = e.SortExpression;

            ViewState["siralamaYonu"] = "ASC";

        }

    }

    // Veriyi tekrar yüklemeden önce sıralanacak alanı ve sıralama kriterini belirlemek gerekir.

    // DataTable nesnesini tekrar elde edip, görünümünü(DataView) değiştiriyoruz

    DataTable dt = (DataTable)GridView1.DataSource;

    dt.DefaultView.Sort = ViewState["siralananKolon"].ToString() +
                           " "
+ ViewState["siralamaYonu"].ToString();

    GridView1.DataBind();

}

30 Ekim 2007 Salı 16:34

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Gridview - Klasik Bir Hata ve Çözümü

ASP.NET 2.0 web projesinde Gridview'de otomatik güncelleme işlemi yaparken eminim ki siz de "ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'Update' that has parameters ..." şeklinde bir hata almıştırsınız. Böyle bir hata almanız durumunda;

1. Tablonuzda bir primary key olduğuna emin olunuz.
2. Gridview'in DataKeyNames özelliğinin primary key'inize eşit olduğuna emin olun.
3. Gridview'in SmartTag penceresinden Edit Columns'a gidin. Selected Fields bölümünden primary key olan alanı seçin ve sağ kısımdan ReadOnly özelliğini False yapın.

Bu hatayı tekrar almayacaksınız diye tahmin ediyorum. Bizzat test edildi ve onaylandı :)
14 Temmuz 2006 Cuma 17:12

Yorum - RSSYorumlar (2)

Etiket:
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Son Videolarım ve Makalelerim

Merhabalar,

Bu aralar bloguma pek birşey ekleyemez oldum:( Ama boş geçmeyelim. nedirtv?com'a ve msakademik.net'e eklediğim son çalışmalarıma aşağıdaki linklerden ulaşabilirsiniz.

nedirtv?com'daki videolarım:
- ASP.NET 2.0: Gridview Kontrolü
- ASP.NET 2.0: Standart Kontroller

MS Akademik'deki son yazılarım:
- ASP.NET ATLAS - 1
- ASP.NET ATLAS - 2

Bu arada bir sitede ASP.NET ATLAS - 1 makalemin bir paragrafının aynen kullanıldığını gördüm.(5-6 cümle, noktası, virgülü dahil harfi harfine kullanmış) Şahıs yazmış yazıyı, altına da ben yazdım diye adını eklemiş. İlginç bir olay yani! Kaynak göstermemişsin, bari biraz değiştir değil mi?
8 Nisan 2006 Cumartesi 00:29

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Bağlantılar



Takip Et

RSS Feed twitter friendfeed

Seminer/Webiner Programım

  • Seminer-WebinerASP.NET 4.0 WebForms Yenilikleri (Microsoft İstanbul Ofisi)
    29 Mayıs 2010

  • Seminer-WebinerVisual Studio 2010 Yenilikleri (Osmangazi Üniversitesi)
    15 Mayıs 2010

  • Seminer-WebinerASP.NET AJAX ile Zengin Internet Uygulamaları Geliştirme (Microsoft İstanbul Ofisi)
    3 Mayıs 2010

>> Etkinlik Takvimi