更改Repeater内部的WebControl ID

时间:2009-05-20 18:26:11

标签: asp.net web-controls

<ItemTemplate>
    <asp:Label runat="server"><%#DataBinder.Eval(Container.DataItem, "Question")%></asp:Label>
    <asp:DropDownList runat="server" id="<%#DataBinder.Eval(Container.DataItem, "QuestionID")%>">>
        <asp:ListItem value="1" text="Yes" />
        <asp:ListItem value="0" text="No" />
    </asp:DropDownList>
<ItemTemplate>

这大致是我想要做的。显然,实施是错误的,但我找不到任何有关我如何在实践中解决这个问题的信息。任何帮助表示赞赏。

编辑:我正在尝试做的是为此Repeater中的每个项添加一个DropDownList,并在提交表单后,使用每个是/否答案的ID输入到数据库中。我正在使用的SqlDataReader有两个字段:问题内容和questionID。

2 个答案:

答案 0 :(得分:4)

我认为你最好在Repeater中使用内置的ID支持。如果目标是为其分配一个ID,以便在数据绑定后轻松找到正确的控件,您可以尝试这样的事情:

<asp:Repeater ID="Repeater1" runat="server>
    <ItemTemplate>
        <asp:Label ID="QuestionID" Visible="False" Runat="server"><%#DataBinder.Eval(Container.DataItem, "FieldContent")%></asp:Label>
        <asp:DropDownList ID="MyDropDownList" Runat="server"></asp:DropDownList>
    </ItemTemplate>
</asp:Repeater>

然后,在您的代码中,您可以遍历Repeater中的项目,直到找到您要查找的标签:

foreach (RepeaterItem curItem in Repeater1.Items)
{
    // Due to the way a Repeater works, these two controls are linked together.  The questionID
    // label that is found is in the same RepeaterItem as the DropDownList (and any other controls
    // you might find using curRow.FindControl)
    var questionID = curRow.FindControl("QuestionID") as Label;
    var myDropDownList = curRow.FindControl("MyDropDownList") as DropDownList;
}   

Repeater基本上由RepeaterItems集合组成。 RepeaterItems使用ItemTemplate标记指定。每个RepeaterItem都有自己的一组控件,这些控件本身就是一个Repeater,它们彼此相关联。

假设您从数据库中提取Repeater数据。每个Repeater项表示查询结果中单个行的数据。因此,如果您将QuestionID分配给标签并将QuestionName分配给DropDownList,则标签中的ID将与下拉列表中的名称匹配。

答案 1 :(得分:0)

你可以从标记文件中删除控件,并挂钩转发器的onItemDataBound事件。在那种情况下,您应该能够“手动”创建下拉控件,分配您想要的任何ID。