发现控制问题

时间:2010-06-10 16:46:32

标签: c# label findcontrol

为什么我不能这样做

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

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

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

当它转到(if1.Label1.Text ==“123”)时 它说 对象引用未设置为对象的实例。

4 个答案:

答案 0 :(得分: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!";
}

答案 1 :(得分:0)

编辑:还要提一下你不能做什么以及你得到什么错误以获得更好的答案...... 你不想使用'Label'(因为Label是一个关键字/类)作为第一个名称。将它命名为Label1或者其他东西......并使用String.Compare()来比较字符串......

答案 2 :(得分:0)

你忘了提到你不能做的事情? 现在发生了什么?

也就像你在评论中提到的那样“LabelName”或“LabelName1” - 那些可能是'l'和'1'(很难发现)

答案 3 :(得分:0)

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