我有一个我正在发布的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,但是注释掉它没有任何区别。
答案 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'),而不是实际名称。
哇。