En iyi yanıtlayıcılar
İç içe Repeater Kullanımı

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.
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
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
-
-
-
-
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.
Burak SARICA
-
<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>
-
<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
-