2010-09-30 17 views
0

如果我有一個自定義用戶控件(比如MyCustomControl.ascx),它包含許多其他控件(包括中繼器),是否有任何方法將該中繼器的模板作爲MyCustomControl的模板公開?如何從另一個包含中繼器的控件公開中繼器的模板?

例如,我希望能夠做到這一點:

<uc:MyCustomControl ID="MyCustomControl1" runat="server"> 
    <ChildRepeaterHeaderTemplate> 
     <!-- code goes here --> 
    </ChildRepeaterHeaderTemplate> 
    <ChildRepeaterItemTemplate> 
     <!-- code that accesses values on the repeater's DataItem goes here --> 
    </ChildRepeaterItemTemplate> 
    <ChildRepeaterFooterTemplate> 
     <!-- code goes here --> 
    </ChildRepeaterFooterTemplate> 
</uc:MyCustomControl> 

有可能超過父控件中的一箇中繼器或其他模板控制,在這種情況下,我想能夠以同樣的方式公開所有這些控件的所有模板。

我的第一個想法是簡單地將中繼器的模板作爲MyCustomControl上的ITemplate屬性公開,但這並不奏效,因爲沒有(明顯的)方式從模板中訪問中繼器的DataItem。

回答

1

就像Brian說的,你需要一個自定義控件,但是如果你有這個控件,你可以暴露ItemTemplates。

namespace MyControls 
{ 
    public class MyControl : System.Web.UI.WebControls.WebControl 
    { 
     System.Web.UI.WebControls.Repeater FirstRepeater = new System.Web.UI.WebControls.Repeater(); 
     System.Web.UI.WebControls.Repeater SecondRepeater = new System.Web.UI.WebControls.Repeater(); 

     [System.Web.UI.PersistenceMode(System.Web.UI.PersistenceMode.InnerProperty)] 
     public System.Web.UI.ITemplate FirstTemplate 
     { 
      get 
      { 
       return FirstRepeater.ItemTemplate; 
      } 
      set 
      { 
       FirstRepeater.ItemTemplate = value; 
      } 
     } 

     [System.Web.UI.PersistenceMode(System.Web.UI.PersistenceMode.InnerProperty)] 
     public System.Web.UI.ITemplate SecondTemplate 
     { 
      get 
      { 
       return SecondRepeater.ItemTemplate; 
      } 
      set 
      { 
       SecondRepeater.ItemTemplate = value; 
      } 
     } 

     protected override void CreateChildControls() 
     { 
      base.Controls.Add(FirstRepeater); 
      object[] FirstDataSource = { 
       new { x = "1" }, 
       new { x = "2" }, 
       new { x = "3" }, 
       new { x = "4" } 
      }; 
      FirstRepeater.DataSource = FirstDataSource; 
      FirstRepeater.DataBind(); 

      base.Controls.Add(SecondRepeater); 
      object[] SecondDataSource = { 
       new { y = "a" }, 
       new { y = "b" }, 
       new { y = "c" }, 
       new { y = "d" } 
      }; 
      SecondRepeater.DataSource = SecondDataSource; 
      SecondRepeater.DataBind(); 

      base.CreateChildControls(); 
     } 
    } 
} 

您需要在包含此控件的控件嘗試分配它們之前實例化您的子中繼器。 此示例在控件內創建兩個子中繼器,並將它們綁定到一些虛擬數據。

而且與使用此控件的頁面:

<%@ Page %> 

<%@ Register Namespace="MyControls" TagPrefix="mc" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form runat="server"> 
    <div> 
     <mc:MyControl runat="server"> 
      <FirstTemplate> 
       <div style="color: blue"> 
        <%# Eval("x")%> 
       </div> 
      </FirstTemplate> 
      <SecondTemplate> 
       <div style="color: red"> 
        <%# Eval("y")%> 
       </div> 
      </SecondTemplate> 
     </mc:MyControl> 
    </div> 
    </form> 
</body> 
</html> 

會得到以下的輸出:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 

</title></head> 
<body> 
    <form method="post" action="" id="ctl01"> 
<div class="aspNetHidden"> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEwMjEyMzEwMzcPZBYCAgMPZBYCAgEPZBYEZg8WAh4LXyFJdGVtQ291bnQCBBYIZg9kFgJmDxUBATFkAgEPZBYCZg8VAQEyZAICD2QWAmYPFQEBM2QCAw9kFgJmDxUBATRkAgEPFgIfAAIEFghmD2QWAmYPFQEBMmQCAQ9kFgJmDxUBAWJkAgIPZBYCZg8VAQFjZAIDD2QWAmYPFQEBZGRk7v0uzzMp0h89eUJash2eToIH2EboQLSZWnkVYXRsGpM=" /> 
</div> 

    <div> 
     <span> 
       <div style="color: blue"> 
        1 
       </div> 

       <div style="color: blue"> 
        2 
       </div> 

       <div style="color: blue"> 
        3 
       </div> 

       <div style="color: blue"> 
        4 
       </div> 

       <div style="color: red"> 
        a 
       </div> 

       <div style="color: red"> 
        b 
       </div> 

       <div style="color: red"> 
        c 
       </div> 

       <div style="color: red"> 
        d 
       </div> 
      </span> 
    </div> 
    </form> 
</body> 
</html> 
1

聽起來像更多的自定義控件(不是自定義用戶控件)給我......但是這可能會增加很多複雜性......您可以嘗試將ChildRepeaterItemTemplate作爲屬性公開,然後可編程設置每個模板子項目時數據綁定...可能工作。

HTH。

+0

那是我想盡了辦法,但無法從訪問直放站的數據那樣的模板。 – Rudism 2010-10-02 16:42:39

相關問題