【问题标题】:unable to find asp checkbox by ID无法通过 ID 找到 asp 复选框
【发布时间】:2012-07-19 16:47:11
【问题描述】:

我无法使用 FindControl 方法在我的 asp Web 应用程序上找到 asp:checkbox。我在我的表单上放了一个复选框:

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

但是我的输出(选中复选框)是: 未找到复选框 复选框被选中

谁能告诉我我做错了什么?

【问题讨论】:

  • 出于好奇,您为什么不能只引用您的复选框而不使用 FindControl?
  • 如果你可以使用 firebug 并尝试找到该复选框的 id
  • @heatStroke 你能把你的代码隐藏中的实际代码放在后面吗
  • 是面板中的复选框
  • 我需要 FindControl 的原因是因为我的表单上实际上有很多复选框,我希望能够以编程方式找到它们。复选框不在面板、表格或其他容器中。

标签: c# asp.net findcontrol


【解决方案1】:

FindControl 方法不是递归的,只有在复选框的直接父级上调用它才能找到您的控件。因此,例如,如果复选框被放置在 UpdatePanel 内,该 UpdatePanel 也在页面内;你需要在UpdatePanel 上调用FindControl 而不是Page.FindControl

您的输出显示:checkbox not found checkbox is checked 的原因是因为您直接调用 test.checked,这将始终有效,因为这是您为复选框提供的 ID。

同样,FindControl 不是递归的,我很肯定这就是它失败的原因。您可以编写自己的“RecursiveFindControl”方法,但这几乎总是矫枉过正且效率低下。

【讨论】:

  • 谢谢,我把我所有的控件都放在了一个 asp:table 中,我的问题就解决了!
【解决方案2】:

您可以使用递归方法通过以下方式找到控件:

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

【讨论】:

  • 正是我认为是一种不好的方法,你建议它!大声笑当您开始在控件树中非常深的控件中使用此方法时,您最终会得到一个像乌龟一样慢的页面。我不得不使用这种技术分析一个页面,并且对递归函数的调用量有时超过了数千。超过 70% 的时间都花在了寻找一个最多可以在一到两个函数调用中找到的控件上。
  • @Icarus :我不建议 OP 使用 abvoe 递归方法,而只是给他一个通过递归找到控件的替代方法....
  • @LolCoder:感谢您的帮助,我相信这在未来会派上用场!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2019-04-24
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多