如何有条件地向重复器控件添加用户控件?

3

我想知道如何有条件地向Repeater控件中添加UserControl。我已经尝试将其添加到Repeater控件中的占位符中,但无法加载UserControl。下面的代码不起作用。

<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或其他什么东西吗? - Antonio Bakula
为什么这是一个糟糕的问题?我正在尝试做这个,但遇到了问题,所以我发帖寻求帮助!如果你不知道,请离开! - SHEKHAR SHETE
感谢Antonio Bakula的回复!我想根据数据库的值来绑定repeater。有没有其他选择? - SHEKHAR SHETE
1
你什么时候调用这个函数?你尝试过调试它来查看方法是否被调用了吗?试着使用itemdatabound事件。 - Adrian Iftode
@SHEKHAR,如果你想得到答案,就应该付出努力。例如,我问你它为什么不起作用,而你却回答另一个问题。如果你不加努力地放任不管,可能就不会有答案了。态度也不会有所帮助。 - Antonio Bakula
真的很抱歉Antonio Bakula!下次我会小心的!当我尝试加载时,它显示未绑定的重复控件!重复控件仍然是空白的! - SHEKHAR SHETE
2个回答

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" %>

3
为什么不尝试在重复器的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);
            }
        }
    }

根据你最后的评论(针对这个问题),你可能还需要确保已将数据源附加并绑定到repeater上。即,
ResultsRepeater.DataSource = dataSource; //whatever your datasource is e.g., datatable, IEnumerable list etc
ResultsRepeater.DataBind();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接