Web窗体对象引用未设置为对象的实例

本文关键字:对象 实例 设置 窗体 对象引用 Web | 更新日期: 2023-09-27 17:49:25

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

我在一个页面上有一堆标签,需要在页面加载时更新。我知道标签的ID是"Label1"-"Label8",但是当我运行以下代码段时,我在Label.Text行上得到"Object reference not set to a instance of a Object",所以我假设找不到标签。

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#还很陌生。

Web窗体对象引用未设置为对象的实例

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

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

您可以像访问表单Id一样访问表单Id。可能是某种可能发生的腐败。试试下面的。

解决方案1:

检查designer.cs文件中是否有以下类型的标签行。如果没有,请手动添加。

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

解决方案2

  1. 删除designer.cs文件
  2. 右键单击父aspx文件,然后选择"转换为Web应用程序">
  3. 这将使用所有适当的条目重新创建designer.cs文件

我希望这对你有帮助。

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

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