这是一个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没问题。但是,我仍然想知道解决方法。
答案 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”;)。