Anasayfa / Yazılım / ASP.NET / DetailsView ve GridView Edit (Düzenleme) Event (Olayı)

DetailsView ve GridView Edit (Düzenleme) Event (Olayı)

Bir önceki yazımda teorik olarak bu iki kontrole ait eventlerden söz etmiştim. Şimdi uygulama yapma zamanı. Bunun için daha önceki yazılarımıza devam ediyoruz. Dolayısı ile aşağıdaki linkten ilgili uygulamayı indirip, bu yazı ile devam edebilirsiniz. Tabi birde Veritabanı yönetim sisteminizde Northwind veri tabanı olduğunu varsayıyoruz.

http://www.ismailgursoy.com.tr/detailsview-kontrolune-stil-vermek/

Bu örneğimde DetailsView kontrolünde listelenmiş olan çalışan verilerini güncellemeyi göstereceğim. GridView ve DetailsView kontrollerinde editleme yapabilmemiz için her iki kontrolünde sahip olmuş olduğu CommandField özelliğini kullanırız. Şimdi uygulamıza başlayalım :

Deafult.aspx sayfasını visual studio da design modda açalım. Altta yer alan DetailsView kontrolümüzü seçip saü üstünde yer alan oka tıklayarak Add New Field diyelim.

Daha sonra açılan pencerede, Choose a field type alanında dropdown menüsünden CommandField seçiniz. Altta yer alan checkbox kutularından Edit/Update Checkboxını seçiniz. Bu sırada Show cancel buton otomatik olarak seçili hale gelecektir, bırakın seçili kalsın.

Bu işlemler tabii ki direkt olarak kod olarakda eklenerek yapılabilir. Eklenecek kod olan blok ya da bu işlemlerin sonucunda eklenen kodu paylaşayım :

DetailsView kontrolünün Fields tagleri arasına aşağıdaki kod eklenmiştir.

 

Artık DetailsView kontrolümün en altında veri listesinin altında bir adet Edit butonu yer alır. Projeyi çalıştırdığımızda bir çalışan seçiniz dediğimizde bunu görebiliriz.

Bu noktada eğer edit butonuna basarak hata alırız. Alacağımız hata;

The DetailsView ‘DetayBilgi’ fired event ModeChanging which wasn’t handled.

Bu hatayı almamız doğal çünkü bizim kontrolümüz edit butona basıldığında ne yapması gerektiğini henüz bilmiyor, yani kod yazmadık henüz. Şimdi Visual Studio’da web formumuzun design görünümüne tekrar geçelim. Altta yer alan DetailsView kontrolümüzü seçelim. Sağ tarafta yer alan properties menüsünde yer alan yıldırım işaratine tıklayalım. Burada seçilen kontrole ait event listesini görebiliriz.

İlgili eventin yanında cif tıkladıktan sonra code behind tarafında visual studio bizim için ModeChanging eventini boş bir şekilde oluşturuyor. Bize ilgili kodları yazmak kalıyor. ModeChanging eventine aşağıdaki kodları ekliyoruz :

protected void DetayBilgi_ModeChanging(object sender, DetailsViewModeEventArgs e)
    {
        DetayBilgi.ChangeMode(e.NewMode);
        DetayBilgiAl();
    }

Şimdi uygulamamızı çalıştırıp, bir çalışanı seçip seçiniz butonuna tıklayalım. Daha sonra DetailsView kontrolünde yer alan edit butonuna tıklayalım ve sonucu görelim.

Görüldüğü üzere artık textbox kontrollerim, update ve cancel butonum hali hazırda beni bekliyor 🙂 Bunlara işlev kazandırmaya sonra geçicez tabi. Şimdi açıklama yapalım. Mode_Changing eventini anlayabilmek için DetailsView kontrolünün görüntüleme modlarını yani display mode’larını bilmemiz gerekiyor.

DetailsViewMode.ReadOnly : Bu mod varsayılan moddur. Veri göstermek için kullanılır. Uygulamamız çalıştırıldığında ve çalışan bilgileri detayı gösterildiğinde gördüğümüz durum DetailsView kontrolümüzün ReadOnly yani sadece okunabilir durumudur.

DetailsViewMode.Edit : Bu mod var olan bir veri kaydının editlenmesi için kullanılır. Bunu zaten gördük.

DetailsViewMode.Insert : Bu mod yeni bir kayıt eklemek için kullanılır. Edit moduna çok benzer ama bu modda tüm kontroller boştur, çünkü yeni veri kaydedilecektir.

ModeChanging eventine baktığımızda dikkat etmemiz gereken diğer bir husus; DetailsViewModeEventArgs sınıfının bir e parametresi almasıdır. e parametresinin NewMode özelliği ile kullanıcı tarafından talepte bulunulan display mode tanımlayabiliyoruz.

Şu anda ayrıntıları görebiliyorum, edit ile düzenleme moduna geçebiliyorum, cancel ile düzenleme modundan çıkabiliyorum. Ancak Update butonum çalışmıyor. Çünkü henüz ilgili item için kodlarımı ve ne yapacağımı tanımlamadım. Bu da daha sonraki yazılarda yer alacak. Şimdi tüm kodlarımı ve ilgili uygulamayı aşağıda paylaşayım.

Default.aspx :

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







    


    

Veri Listesi


<%#Eval("FirstName")%> <%#Eval("LastName")%>

Default.aspx.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Sayfam daha önce yüklenmedi ise veriBagla metodumu çalıştırıyorum
        if (!IsPostBack)
        {
            veriBagla();
        }
    }
    //VeriBagla metodum
    private void veriBagla()
    {
        //SQL bağlantımı, komutumu ve datareader nesnemi tanımlıyorum.
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;
        //Bağlantı satırımı ConfigurationManager sınıfı ile web config dosyasından atamış olduğum isimle çekiyorum.
        string connectionString = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionString);
        //SQL queryimi yazıyorum. Employees tablosundan çekmek istediğim verileri SELECT ile çekiyorum.
        comm = new SqlCommand("SELECT EmployeeID,LastName,FirstName,City,HomePhone FROM Employees", conn);
        try
        {
            //Bağlantımı açıyorum, dataReader nesnemi çalıştırıyorum ve GridView kontrolüme DataBind işlemi yapıyorum.
            conn.Open();
            reader = comm.ExecuteReader();
            GridView1.DataSource = reader;
            GridView1.DataKeyNames = new string[] { "EmployeeID" };
            GridView1.DataBind();
            //Reader nesnemi kapatıyorum
            reader.Close();
        }
            //hata olursa vereceğim mesaj
        catch
        {
            Response.Write("Bir hata oluştu");
        }
            //Bağlantımı kapatıyorum
        finally
        {
            conn.Close();
        }
    }

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //DetayBilgiAl adında bir metot tanımlayacağım bu metot GridView kontrolümün SelectedIndexChanged eventinde çalışacak.
        DetayBilgiAl();
    }
    //DetayBilgiAl metodum
    private void DetayBilgiAl()
    {
        //Seçili satırın indeks numarasını alıyorum ve EmployeeID için değerini case ediyorum.
        int selectedRowIndex = GridView1.SelectedIndex;
        int EmployeeID = (int)GridView1.DataKeys[selectedRowIndex].Value;
        //Sql bağlantımı, komutumu, datareader nesnemi tanımlıyorum.
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;
        //Configurationmanager sınıfından bağlantı adresimi çekiyorum.
        string connectionstring = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionstring);
        //Detay bilgileri almak için SQL Query oluşturuyorum.
        comm = new SqlCommand("SELECT EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,BirthDate,HireDate,Address,City,Region,PostalCode,Country,HomePhone FROM Employees WHERE EmployeeID=@EmployeeID", conn);
        //ilgili EmployeeID parametre değerine göre komutuma atama işlemi yapıyorum.
        comm.Parameters.Add("EmployeeID", System.Data.SqlDbType.Int);
        comm.Parameters["EmployeeID"].Value = EmployeeID;
        try
        {
            //Bağlantımı açıyorum ve verilerimi bağlama işlemi yapıyorum.
            conn.Open();
            reader = comm.ExecuteReader();
            DetayBilgi.DataSource = reader;
            DetayBilgi.DataKeyNames = new string[] { "EmployeeID" };
            DetayBilgi.DataBind();
            reader.Close();
        }
        catch
        {
            //hata olursa vereceğim mesaj
            Response.Write("Bir hata oluştu");
        }
        finally
        {
            //Bağlantımı kapatıyorum
            conn.Close();
        }
    }

    protected void DetayBilgi_ModeChanging(object sender, DetailsViewModeEventArgs e)
    {
        DetayBilgi.ChangeMode(e.NewMode);
        DetayBilgiAl();
    }
}

Bir yorum

  1. Çok teşekkürler. Böyle bir tablo yapmayı istiyordum bende.
    Kaynak bir bilgi oldu benim için.
    İyi yayınlar dilerim

Bir cevap yazın

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