自定义对话框:未将对象引用设置为对象的实例

时间:2013-03-16 13:52:21

标签: c#

我知道这是一个非常常见的错误 - 但作为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()函数之前,不应引用类中的对象。

2 个答案:

答案 0 :(得分:6)

InitializeComponent()调用移到构造函数的开头。

InitializeComponent方法包含设计器生成的所有初始化逻辑,包括您正在使用的btnXlblHeader控件的初始化。

答案 1 :(得分:1)

我知道你已经有了答案,但只是一个小小的补充:

  
    

我的理解是,当您尝试引用非静态对象时,就会发生此错误,就像它是静态对象一样。我在思考正确的方向吗?

  

不是真的。这只是意味着由于错位的InitializeComponent(),对象引用尚未初始化。如果你用静态声明的变量尝试相同的东西,你会得到同样的东西。

如果您声明了一个静态方法,并且尝试在该静态方法的上下文中访问某个成员,那么您将收到错误

  
    

非静态字段,方法或属性“成员”

需要对象引用   

无论如何:为Patko +1:)