我有这样的表单视图和formview_databound()方法:
<asp:FormView ID="frm" runat="server" DataKeyNames="Id" DataSourceID="dsSelectedProduct">
<ItemTemplate>
<asp:BulletedList ID="blstCatlist" DataTextField="Name" DataValueField="Id" runat="server"></asp:BulletedList>
</itemTemplate>
</asp:FormView>
和
if (frm.CurrentMode == FormViewMode.ReadOnl
{
var blstCatlist = frm.FindControl("blstCatlist") as BulletedList;
}
但blsCatlist
为null
。
我真的很困惑!因为可以在 formview_Inserting()事件中找到它,但是在ChangingMode和changedMode上找不到它,引用为null。
实际上我想绑定ItemTemplate中的bulletList和EditTemplate中的CheckBoxList。
答案 0 :(得分:0)
FindControl
才会找到控件;该方法不会在控件内的控件层次结构中进行搜索。
要在您不知道其直接容器时找到控件,您需要一个自定义方法来搜索控件层次结构中的控件。
public static 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;
}
FindControl
上的 FormView
仅适用于FormView的“CurrentMode”属性设置为的模板。
在您的情况下,如果您的FormView设置为只读模式,则只能为“BulletedList”执行FindControl。因为这是您的控件所在的模板。