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

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();

但我在以下行中得到了一个“对象引用未设置为对象实例”的错误:

lblHeader.Text = header; (我也认为我会在'message'这行上遇到它)。

有人能告诉我这里我做错了什么吗?谢谢!

更新答案:在调用InitializeComponent()函数之前,不应引用类内部的对象。


1
附注:您可以将 if (header != null || header != String.Empty) 替换为 if(!String.IsNullOrEmpty(header)) - keyboardP
谢谢键盘,我会这样做的 :) - Mike Baxter
2个回答

6

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

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


谢谢 - 很高兴答案如此简单!至少现在我知道initializeComponent函数是做什么的 ;) +1 - Mike Baxter

1
我知道你已经有了答案,但是还有一个小细节需要补充:
这个错误发生的原因是,当你试图将非静态对象引用为静态对象时会出现。我的理解是对的吗?
不完全正确。这只是意味着由于放错了InitializeComponent(),对象引用尚未初始化。如果你使用静态声明变量尝试同样的操作,你也会得到相同的结果。
如果你声明了一个静态方法并尝试在该静态方法的上下文中访问成员,则会出现错误
一个非静态字段、方法或属性“成员”需要一个对象引用。
无论如何,对Patko点赞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接