Makale Özeti

Eskiden ASP de iç içe kurduğumuz döngüler, ASP.Net ve Repeaterlar ile nasıl olacak diye merak ediyorsanız, bu yazıyı okuyun.

Makale

    Bu konuyu aslında uzun zamandır yazmak istiyordum ama hep erteleniyordu. Sonunda forumda sorulan bir soru ile yazmaya karar verdim. Ama bu yazıyı direk yazmak olmazdı, önceden ItemDataBound olayının bilinmesi gerekir diye düşünüp, bu sistemin temelini oluşturan ItemDataBound yazısını yazdım . Böylece gerekli zemin hazırlanmış oldu. Bundan sonra da iç içe DataRepeater kullanımının nasıl olacağını anlatabilecek duruma gelmiş olduk.

   Genel Yapı

    İç içe repeater konusunu anlatmak için bir örnek hazırlayacağım, bu örneğe göre Sakarya Üniversitesindeki fakülteleri ve bu fakültelerdeki bölümleri listeyeleceğiz. Ben verileri bir veritabanından çağıracağım için, tblFakulteler ve tblBolumler isimli iki tablo oluşturuyorum.  Bunların yapısı aşağıdaki şekilde.


Bu liste tam liste değildir, bölümlerden sadece örnek olarak 3-4 tane alınmıştır.

    Görüldüğü üzere iki tablomun yapısı şekildeki gibi. Aralarında Relationship (İlişki) kurulduğu için tblFakulteler tablosunda ilgili kayıtlarda görünüyor. Bu bizim örneğimiz açısından önemli değil ancak, gelişmiş uygulamalarda Relationship aşırı derecede önem kazanıyor.

    Çıktı Ekranı

    Veritabanımızı oluşturduktan sonra, düşünmemiz gereken nasıl bir çıktı oluşmasını istediğimiz. Yani fakülteler nerede yazacak, bölümler nerede yazacak bunlara karar vermemiz lazım. Ben aşağıdaki gibi bir çıktı oluşturmak istiyorum.

   

    İstediğim gibi çıktı alabilmek içinde aşağıdaki HTML yapısını kullanıyorum. Aşağıdaki kodlara dikkat ediniz, göreceksiniz ki rptFakulteler Repeaterının ItemTemplate özelliği içinde rptBolumler denen başka bir Repeater var.

<html>
<head>
<title>İç İçe Repeater</title>
</head>
<body>
<h1>Sakarya Üniversitesi Fakülteleri ve Bazı Bölümleri</h1>

<table border="0" cellpadding="1" cellspacing="1">
<asp:Repeater id="rptFakulteler" OnItemDataBound="rptFakulteler_ItemDataBound" runat="server">
<ItemTemplate>
<tr>
<td colspan="2"><font face="verdana" size="2"><b><asp:Label id="lblFakulteAd" runat="server" /></b></font></td>
<tr>
<asp:Repeater id="rptBolumler" OnItemDataBound="rptBolumler_ItemDataBound" runat="server">
<ItemTemplate>
<tr>
<td>-</td>
<td><font face="verdana" size="1"><asp:Label id="lblBolumAd" runat="server" /></font></td>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</table>
</body>
</html>

    Sıra verilerde...

    HTML yapımızı da oluşturup, ASP.Net kontrollerinide içine koyduğumuza göre şimdi fakülteleri veritabanından alarak işe başlayabiliriz. Burada basit bir veritabanı bağlantısı kuruyorum ve elimde oluşan DataReader verisini Repeatera bağlıyorum (bind ediyorum).

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\iir\iir.mdb";
objBaglanti.Open();

OleDbCommand objCom = new OleDbCommand();
objCom.Connection = objBaglanti;
string strSQL = "Select fldFno, fldIsim from tblFakulteler";
objCom.CommandText = strSQL;

OleDbDataReader objReader;
objReader = objCom.ExecuteReader();

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

objReader.Close();
objReader = null;

}

    Eğer bu kodu koyup çalıştırırsanız, sadece başlık olan bir ekran göreceksiniz; çünkü veriler henüz tam olarak bağlanmadığı için ekrana çıkmıyor. Verileri tam olarak bağlamak için rptFakulteler için ItemDataBound olayını yazalım.

public void rptFakulteler_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 lblFakulteAd = (Label)e.Item.FindControl("lblFakulteAd");
lblFakulteAd.Text = objRow["fldIsim"].ToString();

Repeater rptBolumler = (Repeater)e.Item.FindControl("rptBolumler");

// Bölümleri listeliyoruz.

OleDbConnection objBaglanti = new OleDbConnection();
objBaglanti.ConnectionString = @"PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=C:\Inetpub\wwwroot\yazi_scs\iir\iir.mdb";
objBaglanti.Open();

OleDbCommand objCom = new OleDbCommand();
objCom.Connection = objBaglanti;
string strSQL = "Select fldIsim from tblBolumler where fldFno = "+ objRow["fldFno"].ToString();;
objCom.CommandText = strSQL;

OleDbDataReader objReader;
objReader = objCom.ExecuteReader();

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

objReader.Close();
objReader = null;


}
}

    ItemDataBound yazısından farksız bir olay aslında, ama biraz daha uzun. Çünkü burada bölümleride listelemek için çağırıyoruz. Bunu yapmak için önce rptBolumler ismindeki Repeaterı FindControl ile buluyorum.  Sonra yine bir veritabanı bağlantısı yaparak rptBolumlere veriyi bağlıyorum. Eğer bu aşamada çalıştırırsanız, ekranda fakültelerin yazdığını ama bölümlerin olmadığını görekceksiniz. Bu yüzden rptBolumler içinde bir ItemDataBound olayı yazalım.

public void rptBolumler_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 lblBolumAd = (Label)e.Item.FindControl("lblBolumAd");
lblBolumAd.Text = objRow["fldIsim"].ToString();

}
}

 

    Bu ItemDataBound olayı son derece basit. Sadece verileri birbirine bağlıyor, böylece ekranda tam bir çıktı oluşuyor.

Sonuç

    Bu tür işlemler sadece örnek yaparak akılda kalır. Sizde benzer örnekler hazırlayarak kodlara olan aşinalığınızı arttırın. Bu yazı daki örnekleri de buraya tıklayarak indirebilirsiniz.