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

时间:2013-05-22 12:42:46

标签: c#

我有一个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字段。很明显,当你们中的一个人指出它时,这将是一件很简单的事情,但是它已经让我头疼了太久了。

1 个答案:

答案 0 :(得分:2)

我怀疑这里可能发生的事情是,表单设计器已经将属性序列化为“Designer.cs”文件,当你不想要它时。

只有在属性是公开的情况下才会发生这种情况。

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

[
    Browsable(false),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]

public MyType MyPropertyWhichMustNotBeSerialized
{
    get;
    set;
}

如果 发生了什么,您应该能够在“Designer.CS”文件中看到不需要的序列化。您可以将其删除,然后如上所示为属性添加属性,那么您应该没问题。