Makale Özeti

Bu makalede DataBind edilen kontrollerin içine bir başka DataBind edilen kontrol kullanımını göreceğiz.

Makale

          Merhabalar;

          Bu makalede DataBind edilen kontrollerin içine bir başka DataBind edilen kontrol kullanımını göreceğiz.

Veritabanımızda bir Kategoriler birde Alt Kategoriler diye iki adet tablomuz olduğunu varsayalım.Birinci Kontrolumuzde kategorileri ve bunun içindeki kontrolumuzde de altkategorilerimizi görelim.Önce iç içe Repeater kullanalım.Bunun için Uygulamamıza önce bir Repeater ekliyoruz ve Veritabanıyla bağlantısını yaparak Categories Tablosunu Bu Repeatera Bind ediyoruz.



         Bunun için Html kısmına aşağıdaki kodları yazıyoruz.
   <asp:Repeater id="Repeater1" runat="server">
      <ItemTemplate>
         <asp:Label Runat="server" ID="label1">
            <%#Container.dataitem("Category")%>
         </asp:Label>
      </ItemTemplate>
   </asp:Repeater>
         Şimdi Sayfamızda Kategorilerimizi görüyorsak buraya kadar bir sorun yok demektir.
         Gelelim içine ikinci Repeateri koyup Alt Kategorilerimizi Listelemeye …

         Şimdi Html kısmındaki kodlarda aşağıdaki değişikliği yapıp ikinci Repeaterı ekliyoruz.
   <form id="Form1" method="post" runat="server" OnItemDataBound = "Repeater1_ItemDataBound">
      <asp:repeater id="Repeater1" runat="server">
         <ItemTemplate>
            <asp:Label Runat="server" ID="label1">
               <%#Container.dataitem("Category")%>
            </asp:Label>
            <asp:Repeater ID="Repeater2" Runat="server">
               <ItemTemplate>
                  <asp:Label Runat="server" ID="Label2">
                     <%#Container.dataitem("SubCategory")%>
                  </asp:Label>
               </ItemTemplate>
            </asp:Repeater>
         </ItemTemplate>
      </asp:repeater>
   </form>
         Şimdi ikinci Repeateri ekledik fakat normal sayfamızda şu an gözükmeyecektir. O yüzden paniğe gerek yok.

         Şimdi CodeBehind kısmına geçip CodeBehind Kısmına bu Repeateri eklediğimizi bi şekilde anlatmamız gerekiyor.Bunun içinde Repeater1’ in ItemDataBound olayına aşağıdaki kodları eklememiz yeterli olacaktır.Bu arada unutulmaması gereken bir noktada da Repeaterin ItemDataBound olayını yazdığımız Sub’ ı Public olarak tanımlamak aksi takdirde Aspx tarafı bunu görmeyecektir.
   Public Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
   Dim dv As DataRowView
      dv = e.Item.DataItem
      Dim Conn As New SqlConnection("data source=localhost;initial catalog=hede;uid=sa;pwd=13579")
      Dim da As New SqlDataAdapter("Select * from SubCategories where CategoryId=" & dv.Item(0), Conn)
      Dim ds As New DataSet
      da.Fill(ds)
      Dim rpt As Repeater
      rpt = e.Item.FindControl("Repeater2")
      rpt.DataSource = ds
      rpt.DataBind()
   End Sub
         Dikkat ettiyseniz bir adet DataRowView tanımladık çünkü sql sorgumuzda CategoryId belirtmezsek bütün alt kategorileri bütün kategorilerde getirecekti. Bu yüzden bir DataRowView tanımladık ve Repeater1 in içindeki veriyi aldık daha sonra sıfırıncı sutunu aldık çünkü CategoryId burada ve sql sorgumuza ekledik.

         Şu anda Kategoriler ve Kategorilerin alt kategorileri gelmiş olmalı …
Peki bunu başka bir kontrolde kullanalım. Örneğin RadioButtonList’ te ….

         Önce İkinci Repeateri silelim ve onun yerine bir RadioButtonList ekleyelim.Html kısmındaki kodlarımız aşağıdaki gibi olacak.
   <form id="Form1" method="post" runat="server">
      <asp:repeater id="Repeater1" runat="server" OnItemDataBound = "Repeater1_ItemDataBound">
         <ItemTemplate>
            <asp:Label Runat="server" ID="Label1">
               <%#Container.dataitem("Category")%>
            </asp:Label>
            <asp:RadioButtonList Runat="server" ID=RadioButtonlist1></asp:RadioButtonList>
         </ItemTemplate>
      </asp:repeater>
   </form>

         Gelelim CodeBehind kısmına
   Public Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
   Dim dv As DataRowView
      dv = e.Item.DataItem
      Dim Conn As New SqlConnection("data source=localhost;initial catalog=hede;uid=sa;pwd=13579")
      Dim da As New SqlDataAdapter("Select * from SubCategories where CategoryId=" & dv.Item(0), Conn)
      Dim ds As New DataSet
      da.Fill(ds)
      Dim rbl As RadioButtonList
      rbl = e.Item.FindControl("RadioButtonList1")
      rbl.DataSource = ds
      rbl.DataTextField = "SubCategory"
      rbl.DataValueField = "SubCategoryId"
      rbl.DataBind()
   End Sub
         Dikkat ettiyseniz değişen çok bir durum yok sadece Verilerin gitmesi gereken yerleri gösterdik, gelelim bunu nasıl kullanacağımıza bunun içinde bir tane buton ekliyoruz ve butonun “click” olayına aşağıdaki kodları yazıyoruz.

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      For Each it As RepeaterItem In Repeater1.Items
         For i As Integer = 0 To CType(it.FindControl("RadioButtonList1"), RadioButtonList).Items.Count - 1
            If CType(it.FindControl("RadioButtonList1"), RadioButtonList).Items(i).Selected Then
               Response.Write((CType(it.FindControl("RadioButtonList1"), RadioButtonList).Items(i).Value))
            End If
         Next
      Next
   End Sub
         Şimdi RadioButtonListte seçtiğimiz Alt Kategorilerin gelmiş olması lazım.
         Tabi sayfanın load olayına yazdığımız kodları if not page.ispostback içine aldıysak.
         Aynı sistemi diğer DataBind edilen kontrollerde ufak bazı değişikliklerle kullanabiliriz.
         Makalem İle ilgili sorularınız için bana fevziakbay@hotmail.com adresinden ulaşabilirsiniz.