Makale Özeti

DataList, DataGrid ve DataRepeater kontrollerinin en önemli olaylarından biri olan ItemDataBound olayını inceliyoruz.

Makale

        Bu yazımda özellikle ASPden olmak üzere bildiğimiz diğer web programlama dillerinden .Nete geçenlerin neredeyse hepsinin "bocaladıkları" bir konuya açıklık getireceğim. Çünkü bu konuda o kadar çok soru alıyoruz ki; artık herkesin bu konuda bi kere "Nasıl olacak?" diye kendine sorduğuna eminim.

       Eskiden ASPde tasarım ve kodlar iç içe karışık olduğu için veritabanından verileri alırken, döngü içerisinde istediğimiz yerde veriyi kontrol ederek duruma göre veriler üzerinde değişiklikler yapabiliyor, fonksiyonlar çalıştırabiliyorduk. Ancak ASP.Nette kodlar ve tasarım birbirinden ayrıldığı için ve verileri listeleme yöntemleri değiştiği için bir çok programcı çıkış yolunu bulmakta zorlanıyor.

ItemDataBound Olayı

       ASP.Nette verileri ekrana listeletmek için kullanılabilecek üç tane nesne var. DataRepeater, DataList ve DataGrid.  Bu nesnesler belli özelliklere göre birbirinden ayrılıyor ve hepsi birbirinden farklı özellikler içeriyor. Ama bence en kullanışlı ve sade olanı DataRepeater.

       Genel olaraksa bu nesnelerin yaptıkları şey aynı, kendisine bağlanan (bind edilen) verileri ekrana bir şekilde yazmak.İşte sorunda burada başlıyor, çünkü bu veri bağlama işlemi sırasında ne bir döngü var ne de başka birşey, iki satır kod ile veriler kontrole bağlanır ve ekrana çıkıyor.

        Ama ASP.Net Nesne Yönelimli Programlama modeline sahip olduğu için, yapacaklarımızı "olaylar" bazında düşünmeliyiz ve çözümler üretmeliyiz. Yani bizim ihtiyacımız olan, bir olay, ekrana veri yazdırılmadan önce her veriye sıra ile tek tek ulaşmamızı sağlayacak bir olay, yani ItemDataBound olayı.

         ItemDataBound, yukarıda adı geçen üç kontrol içinde geçerli olan bir olaydır ve yine biraz yukarıda tanımı yapıldığı gibi; veriler veritabanından ekrana gitmeden önce verilere ulaşılabilecek son noktadır. Bu olay çalıştıktan sonra veriler ulaşılamaz hale gelir ve ekrana basılır. ItemDataBound olayı ekrana yazılacak her veri için çalışıyor; başka bir deyişle veritabanımızda 10 kayıt varsa, 10 defa bu olay çalışacak demektir.

Örnek

        Bir örnek ile bu olayın kullanımını öğrenelim.Şimdi aşağıdaki gibi bir veritabanımız var ve biz bu veritabanına ulaşıp içindeki tüm verileri ekrana yazacağız; ancak ekrana yazmadan önce fldUyeSeviye alanındaki değeri alacak, kontrol edecek ve ona göre ekrana "Genel Sorumlu, Yönetici veya Üye" etiketlerinden birini yazdıracağız.

        Veritabanı olarak aşağıdaki gibi bir yapı kullanıyorum ben.

       Bu veritabanı ile en sonda ulaşmak istediğim çıktı ise aşağıdaki gibi.

       İşe öncelikle tasarım kodlarını yazıp, kontrolleri yerleştirmek ile başlayalım. Burada 3 sütunlu bir tablo ve bu tablo içinde bir DataRepeater nesnesi var. Bu bölümün kodları aşağıdaki gibi.

<html>
<head>
<title>ItemDataBound</title>
</head>
<body>
<h1>Bazı üyelerimiz</h1>
<table border="0" cellpadding="2" cellspacing="1">
<tr>
<td><b>Üye ID</b></td>
<td><b>Üye Nick</b></td>
<td><b>Üye Seviye</b></td>
<tr>
<asp:Repeater id="rptUyeler" OnItemDataBound="rptUyeler_ItemDataBound" runat="server">
<ItemTemplate>
<tr>
<td><asp:Label id="lblUyeId" runat="server" /></td>
<td><asp:Label id="lblUyeNick" runat="server" /></td>
<td><asp:Label id="lblUyeSeviye" runat="server" /></td>
<tr>
</ItemTemplate>
</asp:Repeater>
</table>
</body>
</html>

   Buradaki Repeaterın yapısına özellikle dikkat etmenizi istiyorum, zira gördüğünüz gibi OnItemDataBound="rptUyeler_ItemDataBound" şeklinde bir olayı çağırıyor.

     Tasarım tarafını hallettiğimize göre, işimize kodlar ile devam edelim. Önce gerekli NameSpacei kodlarımıza ekleyelim.

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.Data.OleDb" %>

     Burada Access veritabanı kullanacağımız için OleDb sınıfını kodlarımıza ekledik. Şimdi Page_Load olayını yazalım, bu olay içinde standart olarak veritabanına bağlacak ve verileri çekip rptUyeler isimli DataRepeatera bağlayacağız.

void Page_Load(Object o, EventArgs e)
{
OleDbConnection objBaglanti = new OleDbConnection();
objBaglanti.ConnectionString = @"PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=C:\Inetpub\wwwroot\yazi_scs\idb\idb.mdb";
objBaglanti.Open();

OleDbCommand objCom = new OleDbCommand();
objCom.Connection = objBaglanti;
string strSQL = "Select fldUyeID, fldUyeNick, fldUyeSeviye from tblUyeler order by fldUyeSeviye desc";
objCom.CommandText = strSQL;

OleDbDataReader objReader;
objReader = objCom.ExecuteReader();

rptUyeler.DataSource = objReader;
rptUyeler.DataBind();

objReader.Close();
objReader = null;

}

    Yukarıdaki kodlar standart veritabanına bağlanma kodları; ancak burada aşağıdaki satırlar bizim için özel bir önem taşıyor. Çünkü burada verilerimizi DataRepeater nesnesine bağlıyoruz.

rptUyeler.DataSource = objReader;
rptUyeler.DataBind();

    Verilerimizi nesnemize de bağladıktan sonra işin can alıcı noktasına geldik. ItemDataBound olayının kodları.

public void rptUyeler_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
System.Data.Common.DbDataRecord objRow = (System.Data.Common.DbDataRecord)e.Item.DataItem;

Label lblUyeID = (Label)e.Item.FindControl("lblUyeID");
Label lblUyeKullaniciAdi = (Label)e.Item.FindControl("lblUyeNick");
Label lblUyeSeviye = (Label)e.Item.FindControl("lblUyeSeviye");

lblUyeID.Text = objRow["fldUyeID"].ToString();
lblUyeKullaniciAdi.Text = objRow["fldUyeNick"].ToString();
if (objRow["fldUyeSeviye"].ToString() == "30")
lblUyeSeviye.Text = "Genel Sorumlu";
else if (objRow["fldUyeSeviye"].ToString() == "20")
lblUyeSeviye.Text = "Yönetici";
else if (objRow["fldUyeSeviye"].ToString() == "0")
lblUyeSeviye.Text = "Üye";
}
}

     Kabul ediyorum, ilk başta oldukça karışık gelen bir kod bloğu ama şimdi yavaş yavaş bu bloğu inceleyerek açıklığa kavuşturacağız. Önce bir if kontrolü ile Item veya AlternatingItem öğesinde olup olmadığımıza bakıyoruz. Biliyorsunuz DataGrid veya DataList birçok farklı öğe ve yapı barındırıyor; ama verilerimiz Item veya AlternatingItem içinde oluyor.

      Daha sonra veritabanından bize gelen veriyi objRow isimli bir kayıt nesnesine aktarıyoruz. Bu nesneyi daha sonra veriye ulaşmakta aktif olarak kullanacağız. Ama burada önemle vurgulamak istediğim birşey var: BU SATIR SADECE DATAREADERDAN GELEN VERİLER İÇİN, EĞER SİZ DATADAPTERDEN VERİ BAĞLAYACAKSANIZ BU SATIRI DEĞİŞTİRMENİZ GEREKİR.

      Bu yukarıdaki bölümler sabit olarak kullanmanız gereken bölümler; şimdikiler ise uygulamaya göre değişecek bölümler. Öncelikle üç tane Label nesnesi oluşturuyoruz ve bunları FindControl ile sayfamızdaki repeaterda bulunan Labellar ile birbirine bağlıyoruz. Burada FindControlde sayfada kullandığınız Labelın adına riayet etmeniz lazım; çünkü sistem o isimi arayacaktır. Ama kendi tanımlamanızda verdiğiniz isim farklı olabilir. Bunu da ikini Label tanımında görüyoruz.

      Son olarak tanımladığımız ve bağlantılarını sağladığımız Labellara değer atamak kaldı. Direk Labelların Text özelliklerini kullanarak Labellara veriyi atıyoruz. Bu bölümde de gördüğünüz gibi if kontrolü ile ekrana yazılacak olan seviyeyi belirliyoruz. İstersek burada basit bir if kontrolü yerine özel bir fonksiyonda çalıştırabilirdik. Bu sizin yaratıcılığınıza kalmış bir şey.

       Eğer herşey yolunda ise bu kodu denediğimiz zaman amacımıza ulaşmış olmalıyız ve ekranda aşağıdaki görüntü olmalı.

     Bu zaferle bir yazımızın daha sonuna geldik. Yazımızda geçen dosyaları buradan indirebilirsiniz. Yazıyı daha iyi kavramak için kodları incelemenizi ve kendi örneklerinizi geliştirmenizi tavsiye ederim.