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

"You tried to assign the Null value..." Hatası ve Çözümü

MS Access'te hazırladığınız bir tabloyu AccessDataSource kontrolü ile Insert işlemlerinde kullandığınızda "You tried to assign the Null value to a variable that is not a Variant data type" şeklinde bir hatayla karşılaşabilirsiniz. Ben null değer girişi yapmadım ki böyle bir hata alıyorum demeyin, zira sorun sizden değil Visual Studio'nun Insert cümlenize tablonuzun identity kolonunu veri eklenecek kolonmuş gibi eklenmesinden kaynaklanıyor! Çözüm ise oldukça basit; sayfanızın HTML kodları içerisinde AccessDataSource kontrolünüzün InsertCommand özelliğinden identity kolonunuzun(ki genellikle primary key kolonunuz olur) adını ve parametresini (VALUES kısmındaki ? karakterini) kaldırmanız gerekiyor. Ardından
InsertParameters koleksiyonundan yine bu kolon için eklenmiş olan parametreyi de kaldıracak olursanız artık Insert işlemini başarılı bir şekilde gerçekleştirebilirsiniz.

1 Ocak 2009 Perşembe 15:19

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

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

Veri Kaynağı Olan DropDownList'e Item Ekleme

DropDownList kontrolüne veritabanından getirilen kayıtları yüklememiz durumunda çoğu zaman ilk seçeneğin kullanıcıyı bilgilendirecek bir metin olmasını isteriz. "Bir şehir seçin", "Bir kategori seçin"... gibi bir seçeneğin ilk item olması, devamında da veritabanından gelen item'ların sıralanması eminim ki her uygulamada ihtiyaç olan bir durumdur. Tabi ki veritabanındaki Sehirler tablosunda "Bir şehir seçin" diye bir kayıt eklemek mantıklı olmayacağına göre farklı bir çözüm yolu üretmek gerekli! Sorunu SQL Server tarafında çözmek istersek UNION ifadesi kullanılabilir. Fakat bu yazımda biraz daha farklı bir yoldan bahsetmek istiyorum.

Yapacağımız işlem son derece basit ve kullanışlı bir çözüm yolu olacak. İlk olarak bilgilendirme metnini DropDownList kontrolüne görsel kısımdan ListItem olarak ekliyoruz. Items koleksiyonuna bilgilendirme metnini ekliyoruz. Ardından DropDownList'in AppendDataBoundItems özelliğini true olarak değiştiriyoruz. Eklediğimiz seçenek artık DropDownList kontrolüne item olarak eklenecektir.

<asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True"

    DataSourceID="SqlDataSource1" DataTextField="SehirAdi" DataValueField="SehirId">

    <asp:ListItem Value="-1">Bir şehir seçin</asp:ListItem>

</asp:DropDownList>

AppendDataBoundItems

UNION, UNION ALL ifadelerine alternatif olacak, aklınızda bulunması gereken bir ipucu...

11 Aralık 2008 Perşembe 09:57

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

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

ASP.NET 3.5 ile Gelen Yenilikler

Önümüzdeki günlerde resmen duyrulacak olan Visual Studio 2008 ve .NET Framework 3.5 ile birlikte ASP.NET'te 3.5 sürümüne ulaşmış olacak. Öncelikli olarak şunu belirtmeliyim ki bu sürümde ASP.NET 1.1'den ASP.NET 2.0'a geçişteki gibi köklü yenilikler olmayacak. Fakat gelen yenilikler içerisinde AJAX ve LINQ'nun olduğunu belirtecek olursak aslında bizi oldukça önemli yeniliklerin de beklediğini söyleyebilirim. Dikkatimi çeken noktalardan biri ASP.NET Futures paketi ile gelen bazı kontrollerden şu an için Microsoft'un sitesinde bahsedilmemesiydi. Önceki postumda yer alan .NET Framework 3.5 Namespace ve Class'ları listesinde de yer almayan bu kontroller sanırım başka bir bahara bırakıldı. ASP.NET 3.5 ile gelecek yenilikleri aşağıdaki başlıklarla sizlere aktarmaya çalışacağım.

ASP.NET AJAX Entegrasyonu
ASP.NET AJAX, ASP.NET ortamında hızlı ve kolay bir şekilde AJAX uygulamaları geliştirmemizi sağlayan ücretsiz bir AJAX framework'üdür. ASP.NET 2.0'ın ardından duyrulan ve bu yılın başında resmi sürümü çıkarılan AJAX Extension'ları ASP.NET 3.5 ile mimariyle bütünleşik şekilde geliyor. Visual Studio 2008'de açılan ASP.NET 3.5 web uygulamasında AJAX Extension kontrollerini kullanarak hızlı şekilde AJAX uygulamaları geliştirebiliyoruz. Bu sürümü ile birlikte bazı eksiklikler ve sorunlar giderilerek artık ASP.NET AJAX'ın sunucu kontrolleriyle tam uyumlu şekilde çalışması da sağlanıyor. Visual Studio 2008 ile birlikte Control Toolkit'te yer alan kontrollerin varolan sunucu kontrollerine çok kolay şekilde entegre edilebilmesi de işimizi kolaylaştıracak bir yenilik olarak göze çarpıyor.

LINQ (Language Integrated Query)
.NET Framewrok 3.5 ile birlikte artık web uygulamalarında da Linq hayatımıza girecek. Linq dil ile bütünleşik olarak sorgulamalar yapmamızı sağlayan bir query şeklidir diyebilirim. Veritabanında SQL query'leri kullanarak nasıl sorgulamalar yapıyor ve sorgu sonucunu elde edebiliyorsak, artık C# veya VB.NET gibi bir dil ile de uygulama içerisindeki bir nesnenin içeriği ile ilgili SQL sorgu cümlelerine benzer şekilde sorgulamalar gerçekleştirebileceğiz. ASP.NET 3.5 ile gelen kontrollerden biri olan LinqDataSource kontrolü de bu tip sorgulamaların sonucunu bir veri kontrolüne (GridView, DataList gibi) bağlayabilmemizi sağlıyor.

ListView ve DataPager Kontrolleri
LinqDataSource
kontrolü dışında ListView ve DataPager adında iki yeni kontrol daha geliyor. ListView veri ekleme, güncelleme, silme, sayfalama gibi işlemleri yapabilen ve GridView kontrolüne oldukça benzer bir kontrol. GridView'daki en büyük sıkıntılarımızdan biri görüntülenecek olan verilerin HTML arayüzlerini tasarlamakta karşılaştığımız sorunlardı. ListView kontrolü ise yapısındaki template'ler aracılığıyla verilerin görüntüleneceği arayüzün HTML kodlarını dilediğimiz gibi oluşturabilmemizi sağlıyor. DataPager kontrolü ise ListView ile yapılan işlemlerde kayıtların esnek şekilde sayfalandırılması işleminde kullanılıyor. Bu kontrolün yaptığın temel işlemin sayfalama kısmının ne şekilde görüntüleneceği ve çalışağını belirlemek olduğunu söyleyebilirim. Örneğin sayfa numaralarının görüntüleneceği kısma bir TextBox kontrolü ekleyip yazılan numaradaki sayfaya gidilmesi işlemini DataPager kontrolü ile oldukça kolay şekilde gerçekleştirebiliyoruz.

Web Servislerinde WCF Desteği
Web servisleri artık .NET Framework 3.0 ile gelen WCF (Windows Communication Foundation) desteği ile geliştirilebiliyor. JSON kullanılan AJAX uygulamalarında ve RSS kaynaklarından veri sağlanması gibi işlemler artık WCF ile daha da kolay şekilde gerçekleştirilebilecek.
6 Kasım 2007 Salı 01:03

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'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

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