问题是缺少控件上公共属性的初始化代码。这将在您将控件添加到设计器时为您添加,但如果您将控件替换为派生控件,或者更新组件,那么设计器将不知道如何处理。
如果您有一个具有公共属性 PropertyA 的控件 (wincontrol),并将其添加到表单 (myForm),那么设计器会将属性的所有必要初始化添加到 myForm.Designer.cs。就像是;
Wincontrol1.PropertyA = new List<widget>();
需要稍微修改控件的情况并不少见,假设我们有一个新控件 MyWinControl
public partial class MyWinControl : WinControl
{
public List<wodget> PropertyDer1;
protected List<wodget> PropertyDer2;
}
如果您在 myForm.Designer.cs 中将这个新控件替换为旧控件,那么您很可能会遇到这个问题。原因是 PropertyDer1 在 winforms 设计器中没有初始化。PropertyDer2 不会引起任何问题,因为它受到保护。同样,如果您有一个自定义组件,并且在将组件添加到表单后添加了一个新的公共属性。
但是,如果您删除了窗体上的 WinControl 实例,而是将 MyWinControl 的一个实例拖到窗体上,则会发生正确的初始化并且您不会看到错误。设计师将像这样创建新控件
Wincontrol1.PropertyA = new List<widget>();
Wincontrol1.PropertyDer1= new List<wodget>();
有两种简单的解决方案不需要对设计者隐藏属性。1.如果属性不需要公开,给它正确的修饰符 2.如果属性确实需要公开,那么只需像上面的代码一样编辑myForm.Designer.cs中的代码,添加缺少的初始化器