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便会真正强大。
祝您编码愉快!

09-25 17:15