我有一个带有 ListView 的页面:
<asp:ListView ID="lvContacts" runat="server" ClientIDMode="Predictable" ClientIDRowSuffix="ContactID">
<LayoutTemplate>
<div id="itemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<div class="contactContainer">
<asp:TextBox ID="txtFirstName" runat="server" Text="First Name"></asp:TextBox>
<asp:TextBox ID="txtLastName" runat="server" Text="Last Name"></asp:TextBox>
<!-- other elements removed for clarity -->
</div>
</ItemTemplate>
</asp:ListView>
此 ListView 的数据源是在 Page_Load 期间设置的。
这工作正常,当我检查生成页面的 HTML 时,ContactID(在本例中为 14003)正确添加到文本框 ID 的末尾:
<input name="ctl00$MainContent$lvContacts$ctrl0$txtFirstName" type="text" value="First Name" id="MainContent_lvContacts_txtFirstName_14003" />
<input name="ctl00$MainContent$lvContacts$ctrl0$txtLastName" type="text" value="Last Name" id="MainContent_lvContacts_txtLastName_14003" />
但是,我想在页面发送到浏览器之前在代码隐藏(C#)中操作文本框。
我努力了
FindControl("txtLastName_14003");
FindControl("lvContacts_txtLastName_14003");
FindControl("MainContent_lvContacts_txtLastName_14003");
以及递归变体
private Control FindControlRecursive(Control rootControl, string controlID)
{
if (rootControl.ID == controlID) return rootControl;
foreach (Control controlToSearch in rootControl.Controls)
{
Control controlToReturn = FindControlRecursive(controlToSearch, controlID);
if (controlToReturn != null) return controlToReturn;
}
return null;
}
但以上都没有返回我正在搜索的控件。
当我循环浏览页面中的所有控件时,显示的文本框 ID 没有 ClientIDRowSuffix,因此:
lvContacts
ctrl0
txtFirstName
txtLastName
ctrl1
txtFirstName
txtLastName
ctrl2
txtFirstName
txtLastName
问题:
是否可以在页面创建期间通过搜索其 ID 来访问 ListView 中的控件。ClientIDRowSuffix?如果是这样,我很想举个例子!
如果没有,在页面发送到浏览器之前,是否有其他方法可以根据 ContactID 操作这些文本框?