设置中继器控件的ID

Set IDs of controls of a repeater

我有一个包含一些控件的转发器,我想根据数据库中的 ID 设置它们的 ID。 转发器的数据源是一个列表,所以基本上我想在后面的代码中做这样的事情,在 repeater_ItemDataBound():

var myControl = e.Item.FindControl("controlID");
myControl.ClientIDMode = ClientIDMode.Static;
myControl.ID = e.Item.DataItem("ID"); //but I can't access the ID property, so here's my problem.

考虑到我声明我的转发器是这样的:

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
            <div class="someClass">
               <asp:Label ID="controlID"  runat="server"><%# Eval("Name")%></asp:Label>
               <!-- list of other controls -->
            </div>
    </ItemTemplate>
</asp:Repeater>

不要更改已使用不同 ID 创建的控件的 ID。这可能会导致严重的错误。而是首先使用正确的 ID。或者使用您使用的任何 ID,并将标识符分配给不同的 属性,例如 CommandArgument 如果它是 ButtonValue 如果它是 HiddenFieldText 如果它是(不可见的)TextBoxLabel.

所以在这种情况下,您可以使用另一个控件来存储 ID:

<asp:HiddenField ID="hiddenID" runat="server" Value='<%# Eval("ID")%>' />
<asp:Label ID="lblName"  runat="server"><%# Eval("Name")%></asp:Label>

现在,如果您需要当前项目的 ID 并且您拥有该转发器项目中的标签或其他控件的引用:

var item = (RepeaterItem) lblName.NamingContainer;
HiddenField hiddenID = (HiddenField) item.FindControl("hiddenID");
string id = hiddenID.Value;