我有一个带有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时,ContactIDs(在这种情况下为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操作这些文本框吗?