.NET:如何知道序列化何时完成?

.NET:如何知道序列化何时完成?,.net,winforms,serialization,.net,Winforms,Serialization,构造控件(继承DataGrid)时,会添加特定的行和列。这在设计时非常有效。不幸的是,在运行时,我在同一个构造函数中添加了行和列,但随后数据网格被序列化(在构造函数运行之后),添加了更多的行和列 序列化完成后,我需要清除所有内容并重新初始化行和列。是否有一个受保护的方法,我可以重写它来知道控件何时完成序列化 当然,我更希望不必在构造函数中完成这项工作,把它扔掉,然后在(潜在的)序列化之后再做一次。是否有一个类似于“立即设置自己”的首选事件,以便无论我是否序列化,都只调用一次 我提到的序列化来自

构造控件(继承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不是虚拟的,所以这是错误的


还有什么想法吗?我不能成为第一个创建自定义控件的人。

似乎发生了以下情况:

  • 您已经设计了一个自定义DataGrid,它在构造函数中添加自己的行和列
  • 您已将自定义数据网格添加到表单中
  • 您已经发现表单设计器在表单的InitializeComponent中编写了代码,可以再次添加这些行和列
  • Windows窗体设计器代码生成器的工作方式是查看对象的所有属性,确定默认值,并为未设置为默认值的属性生成代码。不幸的是,DataGrid的默认状态是没有行也没有列

    不过,您可以通过一组属性来改变这种行为。一种简单的方法可能是向类中添加Rows和Columns属性的新副本,该类只返回base.Rows和base.Columns。通过以这种方式添加重复属性,您可以将属性应用于这些属性,您可以使用该属性强制表单设计器忽略预先填充的行和列。

    是否有一种受保护的方法可以覆盖以了解控件何时完成序列化

    不,不是受保护的方法,但有一个接口。如果控件实现,则当Visual Studio下次保存包含自定义控件的窗体/用户控件的.designer.cs时,它将在实例化控件后(但在分配任何属性值之前)立即自动添加对方法的调用,并在设置完所有属性后添加对方法的调用


    然而,虽然这给了你很大的灵活性,但要想正确处理你所描述的事情还是有点麻烦的(我也用过,所以我知道)。如果您的后代完全控制行和列,而用户在设计器中编辑行和列是毫无意义的,那么Tim的建议(DesignerSerializationVisibility)将更简单,更容易正确执行。

    Re:typos-我总是使用小写的“i”当提到我自己时。如果您使用DesignerSerializationVisibility来防止属性写入.designer.cs,那么使用[Browsable(false)]来防止它显示在属性网格中也是一个好主意。如果您不打算保存它,那么允许用户在设计时编辑它会产生误导。
    public override void ResumeLayout()
    {
       base.ResumeLayout();
    
       InitializeMe();
    }