我无法使用FindControl方法在我的asp web应用程序上找到asp:复选框。我在表单上放了一个复选框:
<asp:CheckBox ID="test" Text="Test checkbox" runat="server" />
在我的代码隐藏中,我有以下内容:
Control checkbox = FindControl("test");
if (checkbox != null) Debug.Print("checkbox found");
else Debug.Print("checkbox not found");
if (test.Checked) Debug.Print("checkbox is checked");
else Debug.Print("checkbox is unchecked");
然而我的输出(选中复选框)是: 找不到复选框 选中复选框
有人可以告诉我我做错了吗?
答案 0 :(得分:3)
FindControl
方法不是递归的,如果您在复选框的直接父上调用它,则只会找到您的控件。例如,如果复选框位于UpdatePanel
内,也位于页面内;您需要拨打FindControl
上的UpdatePanel
,而不是Page.FindControl
。
您的输出显示为checkbox not found checkbox is checked
的原因是因为您直接调用test.checked
,这将始终有效,因为这是您为复选框提供的ID。
同样,FindControl
不是递归的,我很肯定这就是它失败的原因。你可以编写自己的“RecursiveFindControl”方法,但这几乎总是一种过度杀伤和效率低下的方法。
答案 1 :(得分:0)
您可以使用递归方法以下列方式查找控件:
private Control RecursiveFindControl(Control root, string id)
{
if (root.ID == id) return root;
foreach (Control c in root.Controls)
{
Control t = RecursiveFindControl(c, id);
if (t != null) return t;
}
return null;
}
使用上面的递归方法找到控件:
CheckBox checkbox = RecursiveFindControl(Page, "test") as CheckBox;
if (checkbox != null) Debug.Print("checkbox found");
else Debug.Print("checkbox not found");
if (test.Checked) Debug.Print("checkbox is checked");
else Debug.Print("checkbox is unchecked");