对象引用未设置为对象的实例(自定义类作为窗体的属性)

本文关键字:窗体 自定义 属性 实例 设置 对象 对象引用 | 更新日期: 2023-09-27 18:14:44

我有一个WinForms应用。

我的一个表单有两个属性,它们是自定义类,即

private cContact con;
private cIP ip;

在LOAD事件中,我将这些属性初始化如下-

this.con = new cContact();
this.ip = new cIP();

这些类的无参数构造函数只是填充ID字段,没有其他内容,例如

class cContact
{
    private int _id;
    //...plus several other properties here
    public cContact()
    {
        this._id = 0;
    }
    public int ID
    {
        get {return this._id;};
        set {this._id = value};
    }
}    

两个类都包含多个属性,而ID只有一个(int)。

两个类都包含所有属性的Get/Set访问修饰符。

这两个类已经使用了一年多,没有任何问题,所以我不认为问题出在类本身。

然后在我的表单中,我有一个事件处理程序,它试图访问两个表单属性(我的自定义类)中的id

private void Button_Click( . . .)
{
    int myID = this.con.ID
}

但是我得到一个消息说

Object reference not set to an instance of an object

由于类是在Form的LOAD事件中实例化的,我不明白为什么按钮单击事件处理程序不能访问类ID字段。我很确定当你们中的一个人指出来的时候,这将是一件简单的事情,但是唉,这已经让我挠头太久了。

对象引用未设置为对象的实例(自定义类作为窗体的属性)

我怀疑这里发生的事情可能是表单设计器在您不希望它序列化属性到" designer .cs"文件时将其序列化了。

这只会在属性是公共的情况下发生。

如果它们公共的,并且如果您不希望表单设计器管理属性值的序列化和反序列化,则必须使用DesignerSerializationVisibility属性来告诉它不要这样做,如下所示:

[
    Browsable(false),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
public MyType MyPropertyWhichMustNotBeSerialized
{
    get;
    set;
}

如果这个就是发生的,您应该能够在"Designer.CS"文件中看到不需要的序列化。您可以删除它,然后像上面所示的那样在属性中添加一个属性,然后应该就可以了。