0

我有一个带有 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 操作这些文本框?

4

0 回答 0