2010-09-17 7 views
7

मैं एक पुनरावर्तक बनाना चाहता हूं जो गुणों के आधार पर हेडर/पाद लेख प्रदर्शित करता है, केवल तभी DataSource खाली है।मैं एक कस्टम पुनरावर्तक कैसे बना सकता हूं जो गुणों के आधार पर शीर्षलेख, पाद लेख प्रदर्शित करता है?

public class Repeater : System.Web.UI.WebControls.Repeater 
{ 
    public bool ShowHeaderOnEmpty { get; set; } 
    public bool ShowFooterOnEmpty { get; set; } 

    [DefaultValue((string)null), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateContainer(typeof(System.Web.UI.WebControls.RepeaterItem)), 
    Browsable(false)] 
    public ITemplate EmptyTemplate { get; set; } 
} 

मैं भी एक EmptyTemplate बनाना चाहते हैं DataSource खाली प्रदर्शन इस टेम्पलेट है ...

मैं कैसे इस को लागू करने पर पता नहीं है। इस व्यवहार को प्राप्त करने के लिए मुझे क्या ओवरराइड करना चाहिए?

उत्तर

4
[ToolboxData("<{0}:SmartRepeater runat=\"server\"></{0}:SmartRepeater>")] 
public partial class SmartRepeater : Repeater 
{ 
    public bool ShowHeaderOnEmpty { get; set; } 
    public bool ShowFooterOnEmpty { get; set; } 

    private ITemplate emptyTemplate = null; 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ITemplate EmptyTemplate 
    { 
     get { return this.emptyTemplate; } 
     set { this.emptyTemplate = value; } 
    } 

    protected override void OnDataBinding(EventArgs e) 
    { 
     base.OnDataBinding(e); 
     if (this.Items.Count == 0) 
     { 
      this.Controls.Clear(); 

      if (this.HeaderTemplate != null && ShowHeaderOnEmpty) 
       this.HeaderTemplate.InstantiateIn(this); 

      if (this.EmptyTemplate!=null) 
       this.EmptyTemplate.InstantiateIn(this); 

      if (this.FooterTemplate != null && ShowFooterOnEmpty) 
       this.FooterTemplate.InstantiateIn(this); 
     } 
    } 
} 

उपयोग:

<UC:SmartRepeater ID="rep" runat="server" ShowHeaderOnEmpty="true" ShowFooterOnEmpty="true"> 
    <HeaderTemplate>HEADER</HeaderTemplate> 
    <ItemTemplate>Item</ItemTemplate> 
    <SeparatorTemplate>, </SeparatorTemplate> 
    <EmptyTemplate><b>Nothing</b></EmptyTemplate> 
    <FooterTemplate>FOOTER</FooterTemplate> 
</UC:SmartRepeater> 
+0

धन्यवाद! यह वहीं है जिसे मैं ढूंढ रहा था! – BrunoLM

0

मैं एक वेब उपयोगकर्ता नियंत्रण (.ascx) बनाउंगा जिसमें आपके हेडर सेक्शन, एक [बच्चे] पुनरावर्तक नियंत्रण और एक पाद लेख शामिल होगा। आप अपने सभी तर्क उस कस्टम नियंत्रण में डाल सकते हैं। पीछे पुनरावर्तक

protected void ShowHideHeaderFooter(object sender, RepeaterItemEventArgs e) 
    { 
     if(e.Item.ItemType == ListItemType.Header && theDataSource.Count == 0 && !ShowHeaderOnEmpty) 
     { 
      e.Item.FindControl("PlaceHolderHeader").Visible = false; 
     } 
     ... 
    } 
-1

तुम सिर्फ एक पुनरावर्तक के साथ ऐसा करना चाहते हैं तो आप ऐसा कर सकते हैं। इसमें पहले से ही EmptyDataTemplate और EmptyItemTemplate तत्व शामिल हैं, इसलिए आपको कुछ भी करने की आवश्यकता नहीं है :)

+1

इस के साथ समस्या यह है कि पुनरावर्तक इसकी प्रतिपादन घटना सक्रिय नहीं होगा अगर कोई रिकॉर्ड डेटा बाइंडिंग प्रक्रिया के माध्यम से बाध्य है। यह उस समस्या के समान है जब आप एक ग्रिड व्यू में रिकॉर्ड जोड़ने के लिए कस्टम फ़ूटर रखना चाहते हैं और आपके पास कोई डेटा नहीं है। –

+0

मैं सही खड़ा हूँ। धन्यवाद – AndreasKnudsen

2

उपयोग ListView के बजाय अपने कोड में

<asp:Repeater runat="server" OnItemDataBound="ShowHideHeaderFooter"> 
    <HeaderTemplate> 
     <asp:PlaceHolder runat="server" ID="PlaceHolderHeader"> 
      HEADER STUFF 
     </asp:PlaceHolder> 
    </HeaderTemplate> 
    <ItemTemplate> 
     ITEM STUFF 
    </ItemTemplate> 
    <FooterTemplate> 
     <asp:PlaceHolder runat="server" ID="PlaceHolderFooter"> 
      FOOTER STUFF 
     </asp:PlaceHolder> 
    </FooterTemplate> 
</asp:Repeater> 

और उसके बाद:

0

आपके द्वारा उल्लिखित सभी गुणों के आधार पर HTML को आउटपुट करने के लिए रेंडर ईवेंट ओवरराइड करें।

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