2

可能重复:
.NET 中的 NullReferenceException 是什么?

我在单个页面上有一堆标签,需要在页面加载时更新。我知道标签的 ID 是“Label1”-“Label8”,但是当我运行以下代码段时,我得到“对象引用未设置为对象的实例”。在 Label.Text 行上,所以我假设无法找到 Label。

int i = 1;
foreach (string sel in selArr)
{
    string labelId = "Label" + i.ToString();
    MySqlCommand cmd = new MySqlCommand(sel, conn);
    MySqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    { 
       Label label = (Label)FindControl(labelId);
       label.Text = "( " + reader["c"] + " )";
    }
    reader.Close();
    i++;
}

我还没有真正尝试过很多其他方法,因为我对 C# 还是很陌生。

4

4 回答 4

3

FindControl 方法只搜索页面的顶层。它不会对整个页面进行递归搜索。

于 2012-12-21T17:42:00.147 回答
1

您可以像您所做的那样访问您的表单 ID。可能是由于某种可能发生的损坏。试试下面的。

解决方案 1:

检查您的Designer.cs文件是否有以下类型的标签行。如果不存在,则手动添加。

protected global::System.Web.UI.WebControls.Label Label3; 

解决方案 2

  1. 删除designer.cs文件
  2. 右键单击父 aspx 文件并选择“转换为 Web 应用程序”
  3. 这应该使用所有适当的条目重新创建 Designer.cs 文件

我希望这对你有帮助。

于 2012-12-21T18:03:21.343 回答
1

如果你知道标签在哪里,告诉 C#,我相信jim 已经记录了一个很好的解释,这不完全是你的答案,但可能会给你这个想法。

于 2012-12-21T17:49:12.317 回答
0

如果您的标签控件在另一个控件中,那么您可以使用以下方法递归浏览页面中的所有控件以找到您的目标:

protected Control RecursiveFindControl(Control targetControl, string findControlId)
    {
        if (targetControl.HasControls())
        {
            foreach(Control childControl in targetControl.Controls)
            {
                if (childControl.ID == findControlId)
                {
                    return childControl;
                }

                RecursiveFindControl(childControl, findControlId);
            }
        }

        return null;
    }

要使用,它会是这样的:

Label label = (Label)RecursiveFindControl(Page, labelId);
于 2012-12-21T18:36:19.960 回答