Anasayfa / Yazılım / ASP.NET / DataList Kontrolü ile Veri Güncelleme, Veri Listeleme – 3

DataList Kontrolü ile Veri Güncelleme, Veri Listeleme – 3

Bu yazıyı okumadan önce aşağıdaki yazıyı okuyunuz..

DataList Kontrolü ile Veri Güncelleme, Veri Listeleme – 2

Şimdi yapmak istediğim şu, bu verilerin her birinin altında bir adet link button olacak ve bu link butona tıklandığında CalisanID bilgisini de göreceğim. Bu düzenlenmeyecek tekrar hatırlatayım.

Şimdi bunlar bir veri listeleme olduğu için bu linkbutton ve bu verilerin gösterileceği alan ItemTemplate içinde olacak. Verileri göstereceğim alan bir Literal kontrol olsun. Sayfamın design kısmını şu şekilde düzenledim, son hali aşağıdaki gibi :

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





    


    
DEPARTMAN : <%#Eval("Departman")%>
AD : <%#Eval("Ad")%>
SOYAD : <%#Eval("Soyad")%>
CommandName="DahaFazlaDetay" CommandArgument=<%#Eval("CalisanID")%>>

Görüldüğü gibi literal kontrolüm ve LinkButton kontrolümü yerleştirdim. Literal kontrolüm LitDetay adında, linkButton kontrolüm detayButon adında. Aşağıdaki gibi bir görüntüye sahip oluyorum aslında :

Şimdi Code Behind tarafında ilgili alanları düzenleyip, bu linkbutona bastığımda literal kontrolümde CalisanID bilgisini göstermem gerekiyor. Öncelikle SQL Komutuma bir parametre daha ekliyorum, Query şöyle olacak yani :

SELECT Calisanlar.CalisanID,Bolumler.Departman, Calisanlar.Ad, Calisanlar.Soyad FROM Bolumler INNER JOIN Calisanlar ON Bolumler.DepartmanID = Calisanlar.DepartmanID

Calisanlar.CalisanID kısmını ekledim. Şimdi DataList kontrolümü design alanında seçiyorum ve Properties penceresinden ItemCommand eventini seçiyor ve çift tıklıyorum, otomatikmen ASP kodum şu şekilde değişiyor :

...
...

...
...
...

onitemcommand eventi gelmiş oluyor ve codebehind tarafında şu kodu yazıyorum :

...
...
protected void DDLCalisanlar_ItemCommand(object source, DataListCommandEventArgs e)
    {
        //Butonuma bir command name atamıştım eğer bu commandname verisinden DahaFazlaDetay bilgisi geliyorsa bu bloğum çalışıyor.
        if (e.CommandName == "DahaFazlaDetay")
        {
            //Bir literal kontrol burada oluşturuluyor ve bu item LitDetay ile bağlanıyor.
            Literal li;
            li = (Literal)e.Item.FindControl("LitDetay");
            //literal kontrolümde gösterilecek bilgiyi CommandArgument özelliği ile çekiyorum.
            li.Text = "Çalışan ID: " + e.CommandArgument + "
"; } } ... ...

Şimdi genel açıklamamı yapayım ve son olarak tekrar kodlarımı tamamen vereceğim. Bu sayfaya iki yeni kontrol ekledim, birisi Literal kontrol, diğeri LinkButton kontrolü.. Kullanıcı LinkButona tıkladığında Literal kontrolümde istenilen veriler görüntülenecek. Literal kontrol tıpkı bir PlaceHolder kontrolü gibidir, HTML veri vs tutabilir. LinkButton adından da anlaşılacağı üzere bir link gibidir ve buton davranışı sergileyebilmektedir. Kullanıcı bu butona tıkladığında server tarafında bir event meydana gelir. Bir LinkButton yerine normal bir butonda kullanabilirdim, işlevselliği aynı olacaktır. Herhangi bir farklılık söz konusu değil, ama görünüm açısından linkbuton kullanmayı tercih ettim. Bu LinkButon kontrolüm ve Literal kontrolüm, DataList kontrolü ItemTemplate içinde yer aldığı için her alınan veri içinde ayrı ayrı görüntüleniyor.

Daha sonra görüldüğü üzere ItemCommand eventini kullandım. Bu event ile DataList kontrolü içinde hangi kontrolüm üzerinde işlem yapılabiliyor bunun bilgisine sahip olabiliyorum.ItemCommand eventi içinde ilgili kontrolümün CommandArgument ve CommandName özelliklerini kullanarak işlem yapabiliyorum.

CommandArgument ile ben örneğimde CalisanID bilgisini alıyorum.

ItemCommand event handlerde e.CommandName ile hangi kontrolden istek geldiğini anlayabiliyorum. Çünkü burada kontrolün CommandName özelliği ile bir isim vererek bu kontrolü bağlama işlemi gerçekleştiriyorum. Örneğimde LinkButon kontrolüm CommandName özelliği DahaFazlaDetay adını taşıyor. Ben bu durumu DataList kontrolümün ItemCommand eventinde kontrol ediyorum, kod kısmında da görüldüğü gibi bir if döngüsü ile bu kontrolümü yapıyorum.

...
...
if (e.CommandName == "DahaFazlaDetay")
{
...
...

LinkButon tıklandığında Literal kontrolümde ilgili veri için CalisanID bilgisi gösteriliyor. Peki bu kontrol ItemTemplate şablonu içinde nasıl bulundu? DataList kontrolü içinde yer alan bir şablondaki bir kontrole erişebilmek için örnektede görüldüğü gibi e.Item’a ait olan FindControl metodunu kullandım. e.Item şablon içindeki kontrollere referans etmektedir. Örneğimde FindControl metodunu kullanarak LitDetay kontrolünü buldurdum. Aşağıdaki gibi :

...
...
Literal li;
li = (Literal)e.Item.FindControl("LitDetay");
...
...

Şimdi tüm kodları bir arada vereyim,

DataListOrnek.aspx :

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





    


    
DEPARTMAN : <%#Eval("Departman")%>
AD : <%#Eval("Ad")%>
SOYAD : <%#Eval("Soyad")%>
CommandName="DahaFazlaDetay" CommandArgument=<%#Eval("CalisanID")%>>

DataListOrnek.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.Configuration;
using System.Data.SqlClient;

public partial class DataListOrnek : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //verilerim tekrarlanmasın diye eğer sayfam ilk kez yükleniyorsa yani daha önceden post back edilmemişse
        //metodum çalışmaya başlıyor.
        if (!IsPostBack)
        {
            VeriListele();
        }        
    }
    //metodum
    private void VeriListele()
    {
        //SQL bağlantımı, Sql komutumu ve Reader nesnemi oluşturuyorum.
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;
        //Sql bağlantımı configuration manager sınıfı vasıtası ile web configden çekiyorum.
        string connectionString = ConfigurationManager.ConnectionStrings["GursoyLtd"].ConnectionString;
        conn = new SqlConnection(connectionString);
        //Sql query burada, SELECT işlemi ile iki tablodan veri alıp tek bir tablodan veri okunuyor gibi oluyor.
        comm = new SqlCommand("SELECT Calisanlar.CalisanID,Bolumler.Departman, Calisanlar.Ad, Calisanlar.Soyad FROM Bolumler INNER JOIN Calisanlar ON Bolumler.DepartmanID = Calisanlar.DepartmanID", conn);
        try
        {
            //Bağlantımı açıyorum.
            conn.Open();
            //ExecuteReader kullanıyorum çünkü bana bir liste veri dönecek.
            reader = comm.ExecuteReader();
            //DataListimi veri ile bağlıyorum ve veri ile dolduruyorum.
            DDLCalisanlar.DataSource = reader;
            DDLCalisanlar.DataBind();
            //Okuma işlemi bitince Reader nesnemi kapatıyorum.
            reader.Close();
        }
            //Hata meydana gelirse catch bloğum çalışacak.
        catch
        {
            Response.Write("Veri listelenemedi, hata oluştu!!");
        }
            //Her ne olursa olsun sonuçta veri tabanı bağlantımı sağlayan nesnemi kapatıyorum.
        finally
        {
            conn.Close();
        }

    }
    protected void DDLCalisanlar_ItemCommand(object source, DataListCommandEventArgs e)
    {
        //Butonuma bir command name atamıştım eğer bu commandname verisinden DahaFazlaDetay bilgisi geliyorsa bu bloğum çalışıyor.
        if (e.CommandName == "DahaFazlaDetay")
        {
            //Bir literal kontrol burada oluşturuluyor ve bu item LitDetay ile bağlanıyor.
            Literal li;
            li = (Literal)e.Item.FindControl("LitDetay");
            //literal kontrolümde gösterilecek bilgiyi CommandArgument özelliği ile çekiyorum.
            li.Text = "Çalışan ID: " + e.CommandArgument + "
"; } } }

Bir Sonraki Yazı :

DataList Kontrolü ile Veri Güncelleme, Veri Listeleme – 4

8 yorum

  1. Merhaba, anlatım için teşekkürler. Datalist kullanımıyla ilgili bir sorunum var.Sizin de bahsettiğiniz şekilde datalist’in itemcommand event’ini tetikliyorum ancak kod bu kısma girmiyor. debug yaparak defalarca denememe rağmen sebebini bulamadım. ne yapmam gerekir yardımcı oabilir misiniz?

  2. Kod bu kısma girmiyor derken, ilgili eventi mi oluşturamıyorsunuz? ASP sayfanız üzerinde de DataList kontrolünüzün ItemCommand eventinin adı geçmeli, aşağıdaki gibi:


    Yani ilgili eventi seçtiğiniz de bu otomatik olarak da oluşur zaten, bu mevcut mu?

  3. ilgili eventi oluşturuyorum. yani kod kısmında
    protected void datalist_ItemCommand(object source, DataListCommandEventArgs e)
    {
    //gerekli kodlar
    }
    şeklinde kod bloğum var ancak program çalışırken bu bloğa girmiyor, ve bu sadece itemcommand eventinde oluyor. datalist_load vb eventler sorunsuz çalışıyor.

  4. Şöyle bir şey yapalım page_load eventi altında siz manuel olarak bir event handler oluşturun.

    datalist.ItemCommand += new DataListCommandEventHandler(datalist_ItemCommand);

  5. Maalesef. page_load’a geliyor, o satıra geldiğinde yine event oluşmuyor.

  6. DataList kontrolünün EnableViewState özelliğini True yaptıktan sonra deneyebilir misiniz?

  7. Olmadı zaten true görünüyor. Anlam veremedim…
    Vaktinizi aldım ilgilendiğiniz için çok teşekkürler. Çözümüyle ilgili bir yöntem bulursam buraya yazacağım.
    İyi çalışmalar

  8. Estağfirullah.. Rica ederim, çözümü paylaşırsanız seviniriz. Ekstra bir çözüm aklımıza gelirse bizde burdan tekrar yansıtırız. İyi çalışmalar.

Bir cevap yazın

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