none
İç içe Repeater Kullanımı RRS feed

  • Soru

  • Merhaba arkadaşlar sınırsız alt kategorili bir sistemim var bu yüzden iç içe repeater kullanarak ağaç yapısında bir menü görünümü yapmak istiyorum. repeaterımın itemtemplate içinde bir repeater daha oluşturarark ItemDataBound eventında aşağıdaki işlemleri yaptım.

     protected void rp_categories_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    tbl_categories category = e.Item.DataItem as tbl_categories;
    
                    Repeater rp_subCategories = e.Item.FindControl("rp_subCategories") as Repeater;
                    rp_subCategories.ItemTemplate = rp_categories.ItemTemplate;
                    rp_subCategories.HeaderTemplate = rp_categories.HeaderTemplate;
                    rp_subCategories.FooterTemplate = rp_categories.FooterTemplate;
    
                    rp_subCategories.DataSource = dal.getCategories(category.categoryId); // alt başlıklar...
                    rp_subCategories.ItemDataBound += new RepeaterItemEventHandler(rp_categories_ItemDataBound);
                    rp_subCategories.DataBind();
                }
            }

    ancak, burada ilk repeaterın tüm templatelerini kopyaladığım için eğer html kontrollerimde class vb. özellikler kullandıysam iç içe olan tüm repeaterlara da bu kontroller olduğu gibi kopyalanıyor. Burada ben iç repeaterlarda html kontrollerime istediğim classı atamak ya da var olan class ya  da özellikleri kaldırmak istiyorum. Bunun bir yolu varmıdır? Ya da izledim yolda bir yanlışlıkmı var ?

    Şimdiden yardımcı olan herkese teşekkürler.

    18 Mayıs 2013 Cumartesi 19:36

Yanıtlar

  •  <asp:Repeater ID="rp_categories" ClientIDMode="Static" runat="server" OnItemDataBound="rp_categories_ItemDataBound">
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <%if (repeaterItemCount % 2 == 0)
                              { %>
                            <li class="even">
                                <%}
                              else
                              {
                                %>
                                <li>
                                    <%
                              } %>
                                    <a href="<%# GetRouteUrl("categories",new {caption = Eval("seoUrl")}) %>"><%# Eval("caption") %></a>
                                    <asp:Repeater ID="rp_subCategories" ClientIDMode="Static" runat="server"></asp:Repeater>
                                </li>
                                <%repeaterItemCount++; %>
                        </ItemTemplate>
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                    </asp:Repeater>

    Şimdi benim önerim şu yönde :

    • repeaterınızı bir div ile sarın. (header ve footer a koymayın, onları tekrarlıyorsunuz çünkü..) 
    • bu div e bir id verin. örneğin rptContainer. sonra head kısmında bir stil tanımlayın. 

    #rptContainer > ul > li.even {

    /* even için tanımladığınız özellikler..*/

    }

    • stiliniz yukardaki gibi olursa, sadece rptcontainer ın içindeki direk çocuk ul nin içindeki direk çocuk even classlı li tagları etkilenir. bu li tagının içindeki diğer even class lı vs hiçbir eleman etkilenmez. tabiki kendi başına even için tanımladığınız class ı artık silmelisiniz. sadece yukardaki gibi özellik atamalısınız even a. eğer even ı başka yerlerde de kullanıyorsanız, en iyisi bu even içindeki özellikleri kopyalayıp, yukardaki örnekte even ismini değiştirip, repeater içinde de bu class ı o isimde kullanmalısınız.

    Burak SARICA

    • Yanıt Olarak İşaretleyen CocoBa 20 Mayıs 2013 Pazartesi 11:48
    20 Mayıs 2013 Pazartesi 11:36

Tüm Yanıtlar

  • css lerini belli başlı selector lar ile yazarsan belki bu iç içe kopyalanmadan doğan sıkıntıları aşabilirsin. Örneğin ilk repeaterın, container elementin içindeki immidiate child dır. aynı isme sahip olsa da özelliklerini buna göre ayırabilirsin. 

    .clsRpt { tüm repeaterların için ortak özellikler..}

    .container > .clsRpt {sadece en dıştakini kapsayan özellikler }

    .clsRpt  .clsRpt {en dıştaki hariç, içerdekiler için özellikler }

    gibi.. Aslında sorunları açarsan, onlara çözüm bulabiliriz. Bu yöntemin yavaşlık haricinde başka handikapını göremiyorum açıkçası. yavaşlığı da control caching ile çözebilirsin rahatça..


    Burak SARICA

    18 Mayıs 2013 Cumartesi 20:25
  • sorun şu aslında,

    ilk repeatarımda bir <li> tagı var bu taga ait bir class var

    <li class="even"></li>

    bunun içteki repeaterlarda kalkmasını istiyorum yani class özelliğini tamamen silmem gerek.

    18 Mayıs 2013 Cumartesi 21:26
  •    <asp:Repeater  runat="server">
                        <ItemTemplate>
    <li class="even">
    ............
    </li>
    
        <asp:Repeater ID="Repeater1" runat="server" DataSource='..........'>
                                            <ItemTemplate>
    <li>
    ............
    </li>
       </ItemTemplate>
                                        </asp:Repeater>
    
    
       </ItemTemplate>
                                        </asp:Repeater>

    19 Mayıs 2013 Pazar 10:03
  • <ItemTemplate>
         <li>
            ............
         </li>
    </ItemTemplate>
    bu yöntemde yukarıda yazmış olduğun kısım yoksayılacaktır. Çünkü baştaki repeater kopyalanıyor eğer ilk yazımı iyice incelersen.
    19 Mayıs 2013 Pazar 10:12
  • sorun şu aslında,

    ilk repeatarımda bir <li> tagı var bu taga ait bir class var

    <li class="even"></li>

    bunun içteki repeaterlarda kalkmasını istiyorum yani class özelliğini tamamen silmem gerek.

    en güzeli repaterın aspx tarafındaki kodunu (ve sarmalayan birer satırı daha) gönderebilirseniz, dediğim gibi bir yöntem geliştirebiliriz. Container ın immidiate child ı olan even class lı li taglarını hedef alırsak, alttaki taglara geçmesini engelleyebiliriz. Kodu yapıştırabilir misiniz?

    Burak SARICA

    19 Mayıs 2013 Pazar 16:06
  •  <asp:Repeater ID="rp_categories" ClientIDMode="Static" runat="server" OnItemDataBound="rp_categories_ItemDataBound">
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <%if (repeaterItemCount % 2 == 0)
                              { %>
                            <li class="even">
                                <%}
                              else
                              {
                                %>
                                <li>
                                    <%
                              } %>
                                    <a href="<%# GetRouteUrl("categories",new {caption = Eval("seoUrl")}) %>"><%# Eval("caption") %></a>
                                    <asp:Repeater ID="rp_subCategories" ClientIDMode="Static" runat="server"></asp:Repeater>
                                </li>
                                <%repeaterItemCount++; %>
                        </ItemTemplate>
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                    </asp:Repeater>

    19 Mayıs 2013 Pazar 16:22
  •  <asp:Repeater ID="rp_categories" ClientIDMode="Static" runat="server" OnItemDataBound="rp_categories_ItemDataBound">
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <%if (repeaterItemCount % 2 == 0)
                              { %>
                            <li class="even">
                                <%}
                              else
                              {
                                %>
                                <li>
                                    <%
                              } %>
                                    <a href="<%# GetRouteUrl("categories",new {caption = Eval("seoUrl")}) %>"><%# Eval("caption") %></a>
                                    <asp:Repeater ID="rp_subCategories" ClientIDMode="Static" runat="server"></asp:Repeater>
                                </li>
                                <%repeaterItemCount++; %>
                        </ItemTemplate>
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                    </asp:Repeater>

    Şimdi benim önerim şu yönde :

    • repeaterınızı bir div ile sarın. (header ve footer a koymayın, onları tekrarlıyorsunuz çünkü..) 
    • bu div e bir id verin. örneğin rptContainer. sonra head kısmında bir stil tanımlayın. 

    #rptContainer > ul > li.even {

    /* even için tanımladığınız özellikler..*/

    }

    • stiliniz yukardaki gibi olursa, sadece rptcontainer ın içindeki direk çocuk ul nin içindeki direk çocuk even classlı li tagları etkilenir. bu li tagının içindeki diğer even class lı vs hiçbir eleman etkilenmez. tabiki kendi başına even için tanımladığınız class ı artık silmelisiniz. sadece yukardaki gibi özellik atamalısınız even a. eğer even ı başka yerlerde de kullanıyorsanız, en iyisi bu even içindeki özellikleri kopyalayıp, yukardaki örnekte even ismini değiştirip, repeater içinde de bu class ı o isimde kullanmalısınız.

    Burak SARICA

    • Yanıt Olarak İşaretleyen CocoBa 20 Mayıs 2013 Pazartesi 11:48
    20 Mayıs 2013 Pazartesi 11:36
  • Yorumlarınız ve önerileriniz için teşekkür ederim.
    20 Mayıs 2013 Pazartesi 11:48