0

これはWindowsフォームアプリケーションです。クラスProgram.csと、リストボックスを含むフォーム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 に答える