.NET:如何知道序列化何时完成?
构造控件(继承DataGrid)时,会添加特定的行和列。这在设计时非常有效。不幸的是,在运行时,我在同一个构造函数中添加了行和列,但随后数据网格被序列化(在构造函数运行之后),添加了更多的行和列 序列化完成后,我需要清除所有内容并重新初始化行和列。是否有一个受保护的方法,我可以重写它来知道控件何时完成序列化 当然,我更希望不必在构造函数中完成这项工作,把它扔掉,然后在(潜在的)序列化之后再做一次。是否有一个类似于“立即设置自己”的首选事件,以便无论我是否序列化,都只调用一次.NET:如何知道序列化何时完成?,.net,winforms,serialization,.net,Winforms,Serialization,构造控件(继承DataGrid)时,会添加特定的行和列。这在设计时非常有效。不幸的是,在运行时,我在同一个构造函数中添加了行和列,但随后数据网格被序列化(在构造函数运行之后),添加了更多的行和列 序列化完成后,我需要清除所有内容并重新初始化行和列。是否有一个受保护的方法,我可以重写它来知道控件何时完成序列化 当然,我更希望不必在构造函数中完成这项工作,把它扔掉,然后在(潜在的)序列化之后再做一次。是否有一个类似于“立即设置自己”的首选事件,以便无论我是否序列化,都只调用一次 我提到的序列化来自
我提到的序列化来自表单的代码隐藏文件中的InitializeComponent()方法
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
...
}
但它不是祖先方法,它只在代码隐藏文件中声明
我注意到InitializeComponent在各种控件上调用SuspendLayout和ResumeLayout。我认为它可以覆盖ResumeLayout,然后执行初始化:
public override void ResumeLayout()
{
base.ResumeLayout();
InitializeMe();
}
但是ResumeLayout不是虚拟的,所以这是错误的
还有什么想法吗?我不能成为第一个创建自定义控件的人。似乎发生了以下情况:
然而,虽然这给了你很大的灵活性,但要想正确处理你所描述的事情还是有点麻烦的(我也用过,所以我知道)。如果您的后代完全控制行和列,而用户在设计器中编辑行和列是毫无意义的,那么Tim的建议(DesignerSerializationVisibility)将更简单,更容易正确执行。Re:typos-我总是使用小写的“i”当提到我自己时。如果您使用DesignerSerializationVisibility来防止属性写入.designer.cs,那么使用[Browsable(false)]来防止它显示在属性网格中也是一个好主意。如果您不打算保存它,那么允许用户在设计时编辑它会产生误导。
public override void ResumeLayout()
{
base.ResumeLayout();
InitializeMe();
}