0

为什么我不能这样做

我有一个数据列表,可以检索出一些数据。如果 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")
时,它说对象引用未设置为对象的实例。

4

4 回答 4

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!";
}
于 2010-06-10T20:48:47.323 回答
0

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

于 2010-06-10T20:12:02.073 回答
0

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

于 2010-06-10T16:49:40.807 回答
0

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

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

于 2010-06-10T16:50:40.393 回答