在DetailsView的TemplateField中查找用户控件

时间:2009-05-19 07:34:10

标签: c# asp.net .net detailsview findcontrol

我有一个我正在发布的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中走动来找到这个孩子......

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

编辑:事实证明我的usercontrol id正在被更改 - 但为什么呢?我在插入和编辑模板上都有相同的ID,但是注释掉它没有任何区别。

2 个答案:

答案 0 :(得分:2)

DataBind控制之后,您将使用:

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

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

答案 1 :(得分:1)

事实证明,用户控件名称已更改 - 我的usercontrol标记为“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'),而不是实际名称。

哇。