循环数据集并插入ListBox时出错

时间:2013-01-30 20:55:31

标签: c# sql winforms datatable dataset

这是一个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());
        }

    }

编辑:添加了屏幕截图

Screenshot of Error

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

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

2 个答案:

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

答案 1 :(得分:0)

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

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

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