3

これは非常に一般的なエラーですが、C#の初心者であるため、問題はあいまいで多くのシナリオに適用できるため、他の投稿を見て問題の原因を見つけるのは非常に困難です。したがって、なぜ私は自分自身の質問を始めているのですか。そうすることで、エラーについてもっと理解できるといいのですが、皆さんが気にしないことを願っています。

このエラーは、静的でないオブジェクトを静的なオブジェクトであるかのように参照しようとすると発生することを理解しています。私は正しい方向に向かって考えていますか?

私の問題はそのようなものです:私は(標準のwinformsのものを使用するのではなく)独自のカスタムダイアログボックスを作成しようとしています。だから私は次のコードを持っています:

public partial class Dialog : Form
{
    public Dialog(string header, string msg, bool closeable, int buttons)
    {
        if (!closeable)
            btnX.Hide();
        if (header != null || header != String.Empty)
            lblHeader.Text = header;
        if (msg != null || msg != String.Empty)
            lblMessage.Text = msg;
        InitializeComponent(); //Problem is here, this should be at the top.
    }

    private void btnX_Click(object sender, EventArgs e)
    {
        Close();
    }
}

Dialog次の行を使用してこのクラスを呼び出しています。

Dialog dlg = new Dialog("HEADER", "HELLO", true, buttonChoice);
dlg.ShowDialog();

しかし、私はObject reference not set to an instance of an objectオンラインになっています:

lblHeader.Text = header; (そして、私はそれを「メッセージ」行にも取得すると思います)。

誰かが私がここで間違っていることを教えてもらえますか?ありがとう!

回答で更新InitializeComponent():関数が呼び出される前に、クラス内のオブジェクトを参照しないでください。

4

2 に答える 2

6

InitializeComponent()呼び出しをコンストラクターの先頭に移動します。

InitializeComponentbtnXメソッドには、使用しているコントロールの初期化やコントロールなど、デザイナーによって生成されたすべての初期化ロジックが含まれてlblHeaderいます。

于 2013-03-16T13:54:34.517 に答える
1

私はあなたがすでに答えを持っていることを知っていますが、ほんの少しの追加です:

このエラーは、静的でないオブジェクトを静的なオブジェクトであるかのように参照しようとすると発生することを理解しています。私は正しい方向に向かって考えていますか?

あまり。これは単に、置き忘れが原因でオブジェクト参照がまだ初期化されていないことを意味しますInitializeComponent()。静的に宣言された変数で同じことを試してみると、同じことがわかります。

静的メソッドを宣言し、その静的メソッドのコンテキストでメンバーにアクセスしようとすると、エラーが発生します

非静的フィールド、メソッド、またはプロパティ'member'にはオブジェクト参照が必要です

とにかく:Patkoの場合は+1 :)

于 2013-03-16T14:00:50.910 に答える