2008-11-29 11 views
7

मेरे पास एक एएसपी.नेट पृष्ठ है जो डेटा की एक सूची उत्पन्न करने के लिए एक और पुनरावर्तक के भीतर घूमने वाले दोहराव का उपयोग करता है। यह निम्न के प्रभाव के लिए है:यदि डेटासोर्स में कोई आइटम नहीं है तो मैं ASP.NET C# में दोहराने वाला कैसे छिपा सकता हूं?

<asp:Repeater> 
    <ItemTemplate> 
     <span><%#Eval("Data1") %></span> 
     <!-- and many more --> 
     <asp:Repeater DataSource='<%#Eval("Data2")%>'> 
      <HeaderTemplate> 
       <ul> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <li><%#Container.DataItem%></li> 
      </ItemTemplate> 
      <FooterTemplate> 
       </ul> 
      </FooterTemplate> 
     </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

(सी #) में कोड-पीछे मैं मूल रूप से LINQ उपयोग कर रहा हूँ एक XML दस्तावेज से जानकारी की एक सूची खींच सकते हैं और पहले पुनरावर्तक है कि जानकारी बाध्य करने के लिए।

इसका उत्तर खोज रहे हैं, ऐसा लगता है कि यह निर्धारित करना है कि नेस्टेड रिपेटर के लिए डेटा खाली है या नहीं। यदि ऐसा है, तो आप दोहराने के लिए पुनरावर्तक की दृश्यता सेट करें।

दुर्भाग्यवश, मैं यह निर्धारित करने में सक्षम नहीं हूं कि इनलाइन को कैसे करें, न कि कोड-बैक में (क्योंकि यह आवश्यक नहीं है कि मैं जो कर रहा हूं उसके लिए काम करे)।

चूंकि मेरे पृष्ठ अब मान्य नहीं हैं, क्योंकि उल डेटा 2 के बिना किसी भी आइटम के लिए खाली हो रहा है, और क्योंकि मैं एक अनियंत्रित सूची का उपयोग करना जारी रखना चाहता हूं, इसलिए मैं आपकी मदद लेता हूं।

कोई विचार?

धन्यवाद!

अद्यतन:

var x = from y in z 
    select new { 
     Data1 = d, 
     // etcetera 
     Data2 = (from j in k 
      where j.Value != String.Empty 
      select j.Value).ToList() 
    }; 

blah.DataSource = x; 
blah.DataBind(); 

उत्तर

10

यह नहीं होगा छिपाने पुनरावर्तक पूरी तरह से है, लेकिन आप पुनरावर्तक नियंत्रण उपवर्ग सकते हैं ताकि यह एक GridView की तरह खाली डेटा टेम्पलेट में शामिल हैं:

using System; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public class EmptyCapableRepeater : Repeater 
{ 
    public ITemplate EmptyDataTemplate { get; set; } 

    protected override void OnDataBinding (EventArgs e) 
    { 
     base.OnDataBinding(e); 

     if (this.Items.Count == 0) 
     { 
      EmptyDataTemplate.InstantiateIn(this); 
     } 
    } 
} 

आप उन्हें अपने में इसका इस्तेमाल कर सकते हैं।इस तरह एएसपीएक्स:

<custom:EmptyCapableRepeater runat="server" ID="rptSearchResults"> 
    <ItemTemplate> 
     <%# Eval("Result")%> 
    </ItemTemplate> 
    <SeparatorTemplate> 
     <br /> 
    </SeparatorTemplate> 
    <EmptyDataTemplate> 
     <em>No results were found.</em> 
    </EmptyDataTemplate> 
</custom:EmptyCapableRepeater> 
0

जब आप अपने LINQ क्वेरी मिलती है:

यदि यह मदद करता है, क्योंकि यह बहुत अच्छी तरह से में क्या करना कोड-पीछे संभव हो सकता है, LINQ इस आशय के लिए कुछ है निष्पादित, इसकी गणना संपत्ति की जांच करें (इसे किसी प्रकार की सूची प्रदान करें)। यदि यह 0 है, तो बस दृश्यमान संपत्ति को गलत पर बदलें।

+0

कि कोड-पीछे ... नहीं "इनलाइन" में है जैसे वह के लिए कहा। मैं वही बात कहने वाला था, फिर मैंने थोड़ा करीब पढ़ा :) –

+0

यदि यह संभव है, तो मैंने LINQ को मूल प्रश्न में जोड़ा है। –

0

जहाँ तक मुझे पता है कि आपको कोडबेइंड के माध्यम से ऐसा करना होगा, बस इसे संभालने के लिए आइटमडेटाबाउंड ईवेंट का उपयोग करें, आप बस इतना कुछ छोड़ सकते हैं, बस कुछ तर्क इनपुट करें जो डेटासेट प्राप्त करता है और यह निर्धारित करता है कि इसमें प्रविष्टियां हैं या नहीं , अगर दोहराना छुपा नहीं है।

3

की तरह कुछ की कोशिश करो करने का प्रयत्न; हालांकि, आपके पीछे कोड में यह है:

मान लें कि आपने अपने माता-पिता के पुनरावर्तक के आइटमडेटाबाउंडएवेंट में श्रोता जोड़ा है, तो आपको एक अनाम प्रकार का उपयोग न करने के लिए अपनी लिनक क्वेरी को थोड़ा बदलना होगा (एक संरक्षित वर्ग बनाएं जिसमें आपकी गुण हों) एमजी मामले में मैं कक्षा नाम के रूप में डीटीओ का उपयोग कर रहा हूं।

void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 

    Repeater rep2 = (Repeater)e.Item.FindControl("rep2"); 
    rep2.DataSource = ((dto)e.Item.DataItem).y; 
    rep2.DataBind(); 
} 

मुझे यह जानना अच्छा लगेगा कि आप क्यों सोचते हैं कि आप इसे कोड में हल नहीं कर सकते हैं।

0

मुझे नहीं लगता कि आप क्या कर रहे है जब मैं कोशिश मैं कोई त्रुटि मिलती है काम करते हैं और डेटा स्रोत सेट के रूप में आप कर रहे हैं करने के लिए जा रहा है नेस्टेड पुनरावर्तक के लिए

<asp:Repeater runat="server" DataSource='<%#Eval("Data2")%>' 
    Visible='<%# ((IEnumerable)Eval("Data2")).GetEnumerator().MoveNext() %>'> 

:

2

सूची दृश्य का उपयोग क्यों नहीं करें? यह EmptyDataTemplate सहित समान कार्यक्षमता प्रदान करता है।

+0

अच्छा सवाल :) मेरा मानना ​​है कि मैं उस समय .NET Framework 2.0 को लक्षित कर रहा था। –

0

मुझे पता है कि यह एक पुराना धागा है और ऊपर का जवाब एक बहुत अच्छा समाधान है, लेकिन मुझे एक ही समस्या थी और मुझे एक और अलग-अलग सरल समाधान मिला है, मैंने सोचा कि मैं भी साझा करूंगा। यह ठीक है और इसे प्रदर्शित करता है।

<FooterTemplate> 
      <li style="display:none;">This will not show.</li></ul> 
</FooterTemplate> 

या यदि आपके तालिकाओं का उपयोग:

बस करने के लिए अपने पाद लेख टेम्पलेट को बदल

<FooterTemplate> 
      <tr> style="display:none;"><td>But something must be in here.</td></tr></table> 
</FooterTemplate> 

आशा है कि किसी को मदद करता है!

+0

साझा करने के लिए धन्यवाद। –

0
गलत पर

OnItemDataBound घटना, सेट दृश्यता में अगर ItemType अगर ItemType एक Item है सच करने के लिए एक Header और सेट दृश्यता है।

1

उपयोग करें:

protected void Repeater1_PreRender(object sender, EventArgs e) 
{ 
    if (Repeater1.Items.Count < 1) 
    { 
     container.Visible = false; 
    } 
} 
+0

प्रीरेंडर (वीबी) में एक और कार्यान्वयन: मंद पुनरावर्तक = सीटीपीई (प्रेषक, पुनरावर्तक) पुनरावर्तक। दृश्यमान = repeater.Items.Count> 0 – Brent

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^