【问题标题】:findcontrol problems发现控制问题
【发布时间】:2010-06-10 16:46:31
【问题描述】:

为什么我不能这样做

我有一个数据列表,可以检索出一些数据。如果 label1 是我们说的 123,那么第二个 label2 必须是不可见的

    Label Label1 = (Label)DataList2.FindControl("LabelName1");
    Label Label2 = (Label)DataList2.FindControl("LabelName2");

    if (Label1.Text == "123")
    {
        Label2.Visible = false;
    }

当涉及到
if (Label1.Text == "123")
它说 对象引用未设置为对象的实例。

【问题讨论】:

  • 您应该能够...您在哪个事件方法中运行它?
  • 我会更改 Label 变量的名称,因为它与 Label 类型相同。称它为Label1 或更有意义的名称。
  • 我在这里使用的名字只是例子
  • 这两个标签是在项目模板中还是在页眉/页脚模板中?

标签: c# label findcontrol


【解决方案1】:

这取决于您处于页面生命周期的哪个阶段。 DataList 使用 ASP.NET 模板来构建它的内部控件集合,这在您调用 DataBind 之前不会发生,这通常会在 PreRender 之前自动发生。在控件集合中创建控件之前,您无法在控件集合中找到它们。

您在页面生命周期的哪个阶段执行此操作?上下文是什么?还有其他事情会使这进一步复杂化(一件事是 FindControl 不是递归的),因为它不一定会向下搜索每个命名容器。但我想更多地了解这在什么情况下不起作用,因为它起作用,但你需要小心。

编辑:

这样的事情应该可以解决问题:

<asp:DataList runat="server" ID="DataList1" OnPreRender="DataList1_PreRender">...</asp:DataList>

然后是后面的代码:

protected void DataList1_PreRender(object sender, EventArgs e)
{
    // the sender in this case is the DataList1 control
    // i often prefer to rely on the sender argument
    Label label1 = (Label)((Control)sender).FindControl("Label1");
    label1.Text = "Yay, it looks like this works!";
}

【讨论】:

  • 我在页面加载时执行它应该在页面加载时发生
  • 这可能是个问题,尝试连接 PreRender 事件,看看它是否改变了一些事情。这些控件是通过实例化模板创建的,这些模板通常推迟到以后的时间,即 PreRender。确保连接正确的 PreRender 事件,最好是 DataList 的事件。
  • 只是c#的初学者,所以我该怎么做嘿嘿
  • 感谢您的回复,但我发现findcontrole甚至找不到标签
  • 发布整个源代码,我们需要调查这个未来。现在,我将开始转储可视控件树并检查页面生命周期中不同点的不同控件,因为我知道没有简单的方法可以告诉您在哪里查看。
【解决方案2】:

你忘了说你不能做什么? 现在发生了什么?

还有像您在评论中提到的“LabelName”或“LabelName1” - 它们可能会混淆“l”和“1”(很难发现)

【讨论】:

    【解决方案3】:

    编辑:还要提到你不能做什么以及你会得到什么错误以获得更好的答案...... 您不想使用“标签”(因为标签是关键字/类)作为第一个的名称..将其命名为 Label1 或其他名称...并使用 String.Compare() 比较字符串...

    【讨论】:

    • year 我知道 label 是一个关键字,只是我已经解决的问题中的一个小错误,现在我该如何使用 string.Compare ?
    • 这可能正在发生,因为它没有找到您的标签..并且在 Label1 中有 null 我猜...尝试在单击事件或某些按钮上执行它...它似乎在页面上加载您可能无权访问...并再次检查它是否是 'LabelName1' 作为名称... String.Compare(C#) - msdn.microsoft.com/en-us/library/zkcaxw5y.aspx
    【解决方案4】:

    我会检查以确保“LabelName2”存在。你可能有错别字。

    【讨论】:

    • if (Label1.Text == "123") 失败,所以不能这样,我们检查了很多次,但感谢您的回复
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多