Anasayfa / Yazılım / ASP.NET / DetailsView Kontrolünün Kullanımı

DetailsView Kontrolünün Kullanımı

Bir veri tablosu içinde daha fazla bilgi görüntülenmek isteniyorsa DetailsView kontrolü başvurabileceğimiz en önemli kontroldür. Bu kontrol ASP.NET 2.0 ile birlikte geldi ve iyiki de geldi 🙂

DetailsView kontrolü listelenen her bir item için detayları bir sayfa yapısı gibi göstermeyi sağlayabilir. Örneğin bir e-ticaret sitesinde ürünler listelenirken sitenin daha hızlı yüklenebilmesi ve bir anda kullanıcıya daha çok bilgi sunulması için başlangıçta veriler listelendiğinde detaya inilmez. Eğer ziyaretçi herhangi bir ürüne tıklarsa bu tıklamasının ardından ilgili detaylar açılır. Böylelikle karmaşık bir site yapısından uzaklaşılmış olunur ve daha hızlı daha dinamik bir site yapılmış olur.

Bu yazımdaki örneğe başlamadan önce aşağıdaki yazıyı okuyunuz ve mevcut örneği indirip bunun üzerinden devam ediniz. (Tabi birde Northwnd veri tabanı olduğunu varsayıyorum)

http://www.ismailgursoy.com.tr/gridview-kayitlarinin-secimi/

Şimdi uygulamaya koyulalım. Örneğimde bir label kontrolünde seçilen verinin ad ve soyad ile seçildiğini belirtmiştim. Şimdi buradaki label kontrolümü kaldırıyorum ve yerine bir DetailsView kontrolü ekliyorum. Bunun sonucunda Default.aspx sayfam :

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







    


    

Veri Listesi


Böylelikle Web formumun design alanı şu an şöyle;

Görüldüğü gibi altta ufak bir tablom daha oluştu. Şimdi data key kullanarak GridView kontrolümün DataBind özelliğini modifiye edeceğim. GridView kontrolünün data key özelliği bize bir veri parçasını göstermeden saklamayı sağlar. Örneğimde ben her bir çalışan için EmployeeID kısmını burada tutacağım. Çünkü bana lazım olacak olan bu. Daha sonra ben bu EmployeeID Data keyinden ilgili çalışan için ekstra bilgileri almayı hedefliyorum. Şimdi Default.aspx formumun code behind tarafında modifiye işlemi yapıyorum. Aşağıdaki gibi bir hal alıyor.

...
...
 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();
        }
...
...

eklemiş olduğum satır

GridView1.DataKeyNames = new string[] { "EmployeeID" };

Görüleceği üzere GridView kontrolümün DataKeyNames özelliğini ayarlayarak neyi burada saklayacağını belirttim. Bu özellik bir anahtar dizisi şeklinde tanımlanır. Çünkü GridView kontrolü her bir satır için sıfır, bir ya da daha fazla anahtar alanı saklayabilmektedir. Örneğimde ben EmployeeID data keylerini tutacak bir string türünde dizi tanımladım. Böylelikle GridView üzerindeki herhangi bir satırda yer alan verinin EmployeeID datakeyine ulaşmak mümkün olacak.

Şimdi bu değişikliğin ardından GridView içinde seçilen çalışan için EmployeeID bilgisini aldıktan sonra artık yapmamız gereken şu, bu kişiye dair daha ayrıntılı bilgiyi DetailsView kontrolümde göstermek. Bunun için GridView kontrolümün SelectedIndexChanged eventinde bir takım kodlar yazmam gerekiyor. Burada veritabanıma bağlanacağım, veri tabanından çekmek istediğim diğer ayrıntılı veri satırlarını sql query de belirteceğim, daha sonra DataReader nesnem ile okuyup verileri yansıtacağım. Tüm bunları yapıyorum ve kodları paylaşıyorum. Açıklamalar kod bloğumun içinde yer alıyor.

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();
        }
    }
         
}

Bunun sonucu olarak ekran çıktım aşağıdaki gibi oluyor..

Bir sonraki yazı DetailsView kontrolüne stil verme..

Bir cevap yazın

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