2012-05-21 53 views
2

我想知道如何將一個UserControl有條件地添加到Repeater控件。我試圖將其添加到位於Repeater Control中的佔位符,但無法加載usercontrol。以下代碼不起作用。如何將UserControl有條件地添加到Repeater控制?

<asp:Repeater ID="ResultsRepeater" runat="server"> 
     <HeaderTemplate></HeaderTemplate> 
     <ItemTemplate> 
     <div> 
      <asp:PlaceHolder ID="PlaceHolder1" runat="server"> 
      </asp:PlaceHolder> 
     </div> 
     </ItemTemplate> 
</asp:Repeater> 

public void GetStatus(int i) 
    { 
     UserControl uc = new UserControl(); 
     if(i==1) 
     { 
      uc = LoadControl("DraftList.ascx") as UserControl; 
     } 
     else if(i==2) 
     { 
      uc = LoadControl("FinalList.ascx") as UserControl; 
     } 


     PlaceHolder p1 = (PlaceHolder)ResultsRepeater.Items[0].FindControl("PlaceHolder1"); 
     p1.Controls.Add(uc); 

    } 
+1

怎麼不工作?它拋出異常,不加載UC或其他東西? –

+0

爲什麼它很差的問題,我正在努力做到這一點ñ有問題,所以我張貼!如果你不知道,然後PLZ離開它! –

+0

感謝Antonio Bakula的回覆!我想根據數據庫值綁定中繼器。他們有其他選擇嗎? –

回答

4

是否有某些原因導致您不想在aspx中處理所有這些問題?這將是最簡單和乾淨選項:

<asp:Repeater runat="server" ID="ResultsRepeater"> 
    <ItemTemplate> 
     <uc1:DraftList ID="DraftList1" runat="server" Visible='<%# ((int)Eval("Status") == 1)%>' /> 
     <uc2:FinalList ID="FinalList1" runat="server" Visible='<%# ((int)Eval("Status") == 2)%>' /> 
    </ItemTemplate> 
</asp:Repeater> 

如果控件是不可見的,(即Visible=false)則沒有標記呈現,所以以這種方式編碼不會造成服務器或任何更多的工作客戶端瀏覽器,同時具有在設計時更容易閱讀和提供用戶控制屬性的益處。

你只需要確保在頁面頂部註冊您的控件:

<%@ Register src="DraftList.ascx" tagname="DraftList" tagprefix="uc1" %> 
<%@ Register src="FinalList.ascx" tagname="FinalList" tagprefix="uc2" %> 
2

爲什麼不嘗試在中繼器ItemDataBound事件中添加它?即,

<asp:Repeater ID="ResultsRepeater" OnItemDataBound="ResultsRepeater_ItemDataBound" runat="server"> 
     <HeaderTemplate></HeaderTemplate> 
     <ItemTemplate> 
     <div> 
      <asp:PlaceHolder ID="PlaceHolder1" runat="server"> 
      </asp:PlaceHolder> 
     </div> 
     </ItemTemplate> 
</asp:Repeater> 

,並在後面

protected void ResultsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Panel PlaceHolder1 = (Panel)e.Item.FindControl("PlaceHolder1"); 

      // declare/obtain the value of i given the DataItem 
      // e.g., 
      int i = ((int)e.Item.DataItem); // or however you're getting i 

      if (i == 1) 
      { 
       var uc = LoadControl("~/DraftList.ascx"); 
       PlaceHolder1.Controls.Add(uc); 
      } 
      else if (i == 2) 
      { 
       var uc = LoadControl("~/FinalList.ascx"); 
       PlaceHolder1.Controls.Add(uc); 
      } 
     } 
    } 

代碼由您最後的評論來看(的問題),你可能還需要確保你已經連接並綁定您的數據源到中繼器爲好。即,

ResultsRepeater.DataSource = dataSource; //whatever your datasource is e.g., datatable, IEnumerable list etc 
ResultsRepeater.DataBind(); 
+0

謝謝Scozzard!絕對我會嘗試這個代碼! –

相關問題