0

这是一个 Windows 窗体应用程序。我有一个类 Program.cs 和一个带有 ListBox 的表单 DeployerConsole.cs。我正在尝试遍历 SQL 查询的结果。我遇到了麻烦,并得到一个“对象引用未设置为对象的实例”。当我尝试访问数据并将其插入表单上的列表框时出错。

编辑: SQL 查询成功完成,并且 Console.WriteLine 使用正确的数据正确输出到输出窗口。

    static void LoadServers()
    {
        DeployerConsole DC = (DeployerConsole)Application.OpenForms["DeployerConsole"];
        //DeployerConsole DC = new DeployerConsole();
        SqlConnection myConnection = new SqlConnection("server=XXX; database=XXX; uid=XXX; pwd=XXX;Integrated Security=true;Connection Lifetime=5;Trusted_Connection=yes;");
        myConnection.Open();
        DataSet ds = new DataSet();
        SqlCommand myCommand = new SqlCommand("SELECT ServerName FROM DeployServers", myConnection);
        SqlDataAdapter adapter = new SqlDataAdapter(myCommand);
        adapter.Fill(ds);
        DataTable dt = ds.Tables[0];
        foreach (DataRow dr in dt.Rows)
        {
            DC.listBox1.Items.Add(dr["ServerName"].ToString());
            Console.WriteLine(dr["ServerName"].ToString());
        }
       
    }

编辑:添加截图

错误截图

有人对我做错了什么有任何建议或提供指导吗?

编辑(回答):好吧,我将代码从类移到了表单中。现在访问 listBox 没有问题。但是,我仍然想知道这个问题的解决方案。

4

2 回答 2

0

您的问题可能是由这行代码引起的:

DeployerConsole DC = (DeployerConsole)Application.OpenForms["DeployerConsole"];

我怀疑 OpenForms 属性返回 null 因为您没有明确设置表单的名称(例如 form.Name = "DeployerConsole";)。

于 2013-01-30T21:29:58.453 回答
0

可能值得一试(仅用于测试目的)尝试:

if(DC.listBox1 != null)
{
  DC.listBox1.Items.Add(dr["ServerName"].ToString());
}

这可以给你一个线索,如果你可能需要确保某个地方 listBox1 被实例化。

 DC.listBox1 = new ListBox();

编辑

可能是 DC 没有通过对静态方法的引用正确传递。更改方法的签名以接受表单可能会更好。

static void LoadServers(Form form)
{ 
 ...
 form.listBox1.Items.Add(...)
 ... etc.
}

并从以下形式假设:

Helper.LoadServers(this);
于 2013-01-30T21:08:20.047 回答