无法通过ID找到asp复选框

时间:2012-07-19 16:47:11

标签: c# asp.net findcontrol

我无法使用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");

然而我的输出(选中复选框)是: 找不到复选框 选中复选框

有人可以告诉我我做错了吗?

2 个答案:

答案 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");