在页面创建期间从代码隐藏中访问ListView中的TextBox(在ControlID中使用ClientIDRowSuffix)

时间:2013-10-11 10:11:37

标签: c# asp.net .net listview

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

0 个答案:

没有答案