C# Visual Studio designer不为“列表”生成代码<;T>;``Windows.Forms.Control'的成员`
以下类(Windows窗体控件)是列表控件的一种类型, 并且C# Visual Studio designer不为“列表”生成代码<;T>;``Windows.Forms.Control'的成员`,c#,winforms,visual-studio-2010,visual-studio-designer,C#,Winforms,Visual Studio 2010,Visual Studio Designer,以下类(Windows窗体控件)是列表控件的一种类型, 并且ListControlItem不继承任何Windows控件类 public class ListControl : Control { private List<ListControlItem> items; public ListControl() { // // Required for Windows Form Designer support
ListControlItem
不继承任何Windows控件类
public class ListControl : Control
{
private List<ListControlItem> items;
public ListControl()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.items = new List<ListControlItem>();
}
public List<ListControlItem> Items
{
get { return items; }
set { items = value; }
}
}
对于列表视图
:
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("");
this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1,
listViewItem2,
listViewItem3,
listViewItem4,
listViewItem5,
listViewItem6});
我试图搜索列表视图
和列表视图项
来解决问题,
ListView
有一个名为ListViewItemCollection
的“自己的列表类”,它实现了IList、ICollection、IEnumerable等接口,但list
实现了相同的接口
我需要为它实现自定义序列化吗?也许这只是序列化到资源文件。我找不到太多文档,因为它没有继承任何Windows窗体控件基类
更新
将属性[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
放入列表
属性为每个列表
项提供一个资源
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items"))));
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items1"))));
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items2"))));
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items3"))));
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items4"))));
this.listControl1.Items.Add(((ListControlItem)(resources.GetObject("listControl1.Items5"))));
这就像为
ListControlItem
实现自定义序列化一样,可能会有所帮助。有必要为类实现TypeConverter
。这个TypeConverter
所做的只是返回类的构造函数描述符
另外,使用参数[TypeConverter(typeof(TypeConverter))]
指定类的TypeConverter
根据MSDN,在本例中,更具体地说是关于在运行时生成属性初始化代码的类型转换器
NET框架提供了生成动态
在设计时初始化属性的属性初始化代码
运行时的属性
开发人员可以构建生成基于构造函数的类型转换器
初始化代码。这些类型转换器可以生成构造函数
使用设计时设置的值动态编码,以便配置
运行时类型的属性。类型转换器实现
配置的构造函数的类型和值的逻辑
财产
Visual Studio设计器的结果代码
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
TypeConverter
只返回一个无参数构造函数,但可以在TypeConverter
代码中更改
关于CodeDomSerializer
如果您需要在构造函数之外生成代码来初始化
属性,可以通过实现
自定义CodeDomainSerializer并应用DesignerSerializerAttribute
将类型的CodeDomSerializer与类型相关联。这
该方法通常仅用于动态
组件初始化的受控或自定义代码生成
这很重要。有关此方法的更多信息,请参阅
CodeDomSerializer的文档
也就是说,使用answer方法时,需要将属性值传递给构造函数参数。如果这还不够(比如不在构造函数上设置属性),那么可能需要像@Octopoid所说的那样使用
CodeDomSerializer
。您希望实现什么?可能还有另一种解决问题的方法。与ListView
相同。让Visual Studio设计器为每个ListControlItem
生成代码,而不是放在资源文件.AFAIK中。为此,您需要使用。这应该允许您定义如何将代码生成到分部设计器类中。具体来说,我认为您应该使用CodeDomSerializer
,正如您在最后一段中所怀疑的那样。几乎是重复的问题,但是列表的类型为Int
@Octopoid是的,MSDN会像您所说的那样记录CodeDomSerializer
,但仅适用于自定义类型或需要以自定义方式序列化属性的情况。否则它应该使用反射api进行序列化,所以我认为不需要它。也许为列表
实现一个类会有所帮助。
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());
this.listControl1.Items.Add(new ListControlItem());