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;
}
Yararlı bir yazı olmuş (:
Teşekkürler.Googleda aramam üzerine en faydalı ve kullandığım bu oldu.