1

我有一个 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

由于类是在窗体的 LOAD 事件中实例化的,我看不出为什么按钮单击事件处理程序无法访问类 ID 字段。当你们中的一个人指出它时,很确定这将是一件简单的事情,但可惜它已经让我挠头太久了。

4

1 回答 1

2

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

但是,只有当属性是公开的时才会发生这种情况。

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

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

public MyType MyPropertyWhichMustNotBeSerialized
{
    get;
    set;
}

如果发生了这种情况,您应该能够在“Designer.CS”文件中看到不需要的序列化。您可以将其删除,然后如上所示为属性添加一个属性,然后您应该就可以了。

于 2013-05-22T12:50:54.513 回答