2

我有一个要发回的 DetailsView - 其中有一个 UserControl。我很难在回发数据中找到它。

举个例子:

<asp:DetailsView ID="dvDetailsView" runat="Server" AutoGenerateRows="false">
<Fields>
  <asp:TemplateField>
    <ItemTemplate>
      Some text here
    </ItemTemplate>
    <EditItemTemplate>
      <uc:UserControl ID="ucUserControl" runat="server" />
    </EditItemTemplate>
    <InsertItemTemplate>
      <uc:UserControl ID="ucUserControl" runat="server" />
    </InsertItemTemplate>
  </asp:TemplateField>
</Fields>
</asp:DetailsView>

当我回发时,我会假设我会做这样的事情:

MyUserControlType ucUserControl = dvDetailsView.FindControl("ucUserControl") as MyUserControlType;

但这什么也没找到。事实上,我什至在 QuickWatch 中四处走动都找不到这个宝贝……

我需要做什么才能找到这个东西?

编辑:事实证明我的用户控件 ID 正在更改 - 但为什么呢?我在插入和编辑模板上确实有相同的 ID,但将其注释掉并没有什么区别。

4

2 回答 2

2

控制后 DataBind,您将使用:

dvDetailsView.Rows[0].Cells[0].FindControl("ucUserControl")

并确保您仅在编辑模式下执行此操作,因为该控件仅存在于EditItemTemplate.

于 2009-05-19T07:39:30.457 回答
1

事实证明,用户控件名称已更改 - 我的用户控件,标记为“ucUserControl”,其名称已更改为通用名称 - 'ctl01'。

于是,做了一个dvSituation.Rows[0].Cells[0].FindControl("ctl01")发现控件。

为了找到这个 ID,我只是查看了正在呈现的 HTML 元素,并从 id 中检查了父元素,例如 ' ctl00_MainContent_dvDetailsView_ctl01_lblLabel',其中 lblLabel 出现在 ucUserControl 上。

rows 列是基于 0 的字段数索引,如果您指定了 headertemplate,则单元格索引将为 1。

编辑:天哪!有人(真的不是我,我发誓)隐藏了控件类的 ID 属性!

public partial class UserControl : BaseControl
{
  public int Id;
}

这意味着当 ASP.Net 生成 id 时,它不能,它只是为控件分配了一个通用的 Id(在本例中为“ctl01”),而不是实际的名称。

哇。

于 2009-05-20T00:22:42.880 回答