Anasayfa / Yazılım / ASP.NET / DetailsView Kontrolünü SqlDataSource Objesine Bağlamak – 2

DetailsView Kontrolünü SqlDataSource Objesine Bağlamak – 2

Bir önceki yazımda DetailsView kontrolünü SqlDataSource objesine bağlamayı anlatmıştım. Bu yazıya devam niteliğinde devam ediyorum. Uygulamamıza devam ediyoruz. Aşağıdaki linkten yazıya göz atabilir ve ilgili uygulama dosyasını indirebilirsiniz. Bu arada Sql Serverinizde Northwnd veritabanı kurulu olduğunu farzediyorum. (Northwnd veri tabanını sitede bulabilirsiniz)

http://www.ismailgursoy.com.tr/detailsview-kontrolunu-sqldatasource-objesine-baglamak-1/

İlk olarak Header Template alanımda bir kişi düzenleme esnasında Yeni bir kişi ekleyiniz gibi bir yazı yazsın istiyorum. Bunun için, web formumda DetailsView kontrolümün HeaderTemplate alanında aşağıdaki düzenlemeleri yapıyorum.

...
...
<%#Eval("FirstName") == null ? "Yeni çalışan ekleme" :
Eval("FirstName")%>  <%#Eval("LastName")%>
...
...

Böylelikle mevcut çalışan üzerinde bir düzenleme yapacaksam Header alanımda çalışan kişinin ad ve soyad bilgisi görülecek. Yeni bir kişi ekleyeceksem header alanında bu sefer Yeni Çalışan Ekleme yazacak.

Aşağıdaki ekran görüntülerinde bunu görebilirsiniz.

Şimdi bir sorunumuz mevcut. Nedir bu sorun? DetailsView kontrolüm üzerinde bir çalışan üzerinde değişiklik yaptığımda bu değişiklik GridView kontrolüme yansımıyor. Örneğin bir çalışan seçiyorum ve adını İsmail yapıyorum. Daha sonra Update diyorum. DetailsView kontrolümde bu değişiklik yapıldı, ancak GridView kontrolümde olmadı.

Bu durum ancak ilgili sayfamı yeniden yükler isem düzgün görüntülenecek. Peki bu durum neden kaynaklanıyor? Bunun nedeni şu, veritabanım güncellenmeden DetailsViw kontrolüm üzerinde yapmış olduğum değişiklik daha önceden veri ile doldurulmuş olan GridView nesneme yansımıyor. Bu problemi aşmak için DetailsView kontrolünde belirli olaylar meydana geldikten sonra GridView kontrolümde de bir takım güncellemelerin yapılabilmesini sağlamak yani aslında bu olaylar meydana gelirken GridView kontrolüme DataBase’den yeniden veri çekmek.

Peki bu olaylar hangileri diye sorarsanız bunlar ItemUpdated, ItemDeleted ve ItemInserted. Şimdi bu olayları oluşturalım. Web formumda Design alanında DetailsView kontrolümü seçiyorum. Daha sonra sağda yer alan Properties alanında yıldırım işaretine tıklıyorum yani eventleri listeliyorum. Burada yer alan ItemUpdated, ItemDeleted, ItemInserted olaylarına çift tıklıyoruz bu olayları oluşturuyoruz.

Daha sonra Default.aspx.cs sayfamızda aşağıdaki gibi düzenlemelerimizi yapıyoruz.

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
    {
        GridView1.DataBind();
    }
}

Böylelikle artık güncelleme yapar yapmaz aynı anda GridView kontrolümede de değişiklik yansıdı. Tabi sıralama nedeni ile isim diğer sayfalara kaymış olabilir, bu durumu dikkate alınız.

Formumuzu biraz daha geliştirelim. Diyelim ki bu sayfa yüklendi. Herhangi bir isim seçip ondan sonra yeni bir çalışan kaydı oluşturma işlemini GridView kontrolüm üzerinde yer alan bir linkbutton ile gerçekleştirelim.

Web formumda GridView kontrolümün hemen üstüne bir linkbuton ekliyorum. Bunun için ToolBox’dan sürükleyip bırakabilirim ya da direkt kod tarafından,

Daha sonra Web formumun design alanında bu link butona çift tıklıyorum ve link butonumun Click eventinde aşağıdaki kodları yazıyorum.

 protected void CalisanEkleLinkButon_Click(object sender, EventArgs e)
    {
        DetayBilgi.ChangeMode(DetailsViewMode.Insert);
    }

Böylelikle artık bu link butona tıkladığımda DetailsView kontrolüm yeni bir çalışan ekleme moduna geçiyor. Tüm TextBoxlar boş bir şekilde görüntüleniyor. Üstteki kodda da zaten DetailsView kontrolümün ChangeMode özelliğini Insert haline getirdim.

Şimdilik örneğimizi bu kadar geliştirelim, bir sonraki yazı da DetailsView kontrolümnüzde veri tabanından veri çekerek listeleme yapmaya değineceğim.

Uygulamamızda ki kodlar :

Default.aspx :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>







    


    

Veri Listesi


<%#Eval("FirstName") == null ? "Yeni çalışan ekleme" : Eval("FirstName")%> <%#Eval("LastName")%>

Default.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void DetayBilgi_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
    {
        GridView1.DataBind();
    }
    protected void CalisanEkleLinkButon_Click(object sender, EventArgs e)
    {
        DetayBilgi.ChangeMode(DetailsViewMode.Insert);
    }
}

Aşağıdaki linkten uygulamayı indirebilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir