我有一个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字段。很明显,当你们中的一个人指出它时,这将是一件很简单的事情,但是它已经让我头疼了太久了。
答案 0 :(得分:2)
我怀疑这里可能发生的事情是,表单设计器已经将属性序列化为“Designer.cs”文件,当你不想要它时。
只有在属性是公开的情况下才会发生这种情况。
如果他们 是公开的,并且您不希望表单设计器管理序列化和反序列化属性的值,则必须使用DesignerSerializationVisibility
属性告诉它不要,像这样:
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
public MyType MyPropertyWhichMustNotBeSerialized
{
get;
set;
}
如果 发生了什么,您应该能够在“Designer.CS”文件中看到不需要的序列化。您可以将其删除,然后如上所示为属性添加属性,那么您应该没问题。