将构造函数参数传递给在InitializeComponent内部创建的控件



InitializeComponent在表单上设置组件,但对于我创建的Usercontrol,它调用默认构造函数,但我想在Usercontrol上调用我自己的构造函数(带参数)。样板代码说不要编辑内容,那么最好的方法是什么呢?

您需要创建一个TypeConverter类,并用TypeConverterAttribute(typeof(MyTypeConverter))装饰UserControl。类型转换器将告诉Visual Studio如何创建类型,从而允许您控制InitializeComponent中的内容。你可以非常深入地写一个自定义的CodeDomSerializer,然后你可以在其中写出你想要的任何C#代码——我用这个技术强制InitializeComponent方法解析Castle Windsor中的所有Forms控件!这真的很好。。。

不管怎样。。。

您会注意到MS已经将这种技术用于以下类型:

this.treeView1 = new System.Windows.Forms.TreeView();
this.treeView1.Location = new System.Drawing.Point(72, 104);
this.treeView1.Name = "treeView1";
this.treeView1.Nodes.AddRange(
new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Node0"),
new System.Windows.Forms.TreeNode("Node1")});

基本上,在TypeConverter中,您覆盖"ConverterTo"方法,并返回一个新的InstanceDescriptor,它将向WinForms设计器描述如何实例化您的类型(使用什么构造函数,传递什么参数)。

您可以在这里找到更多信息(包括基本实现):http://msdn.microsoft.com/en-us/library/ms973818.aspx

InitializeComponent非常强大,一旦您了解了所有的可扩展性点。编码快乐!

最新更新