以下类(Windows 窗体控件)是一种列表控件,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; }
}
}
问题是,在设计时,Visual Studio 尝试将列表内容序列化到表单的资源文件中,而不是创建用于实例化每个项目的代码,然后像使用ListView
和一样添加到控件中ListViewItem
。
Visual Studio 设计生成的代码ListControl
:
this.listControl1.Items = ((System.Collections.Generic.List<ListControlItem>)(resources.GetObject("listControl1.Items")));
对于ListView
:
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
并ListViewItem
解决这个问题,
ListView
它有一个名为“自己的列表类” ListViewItemCollection
,它实现了接口IList, ICollection, IEnumerable
,但List<T>
实现了相同的接口。
我需要为它实现自定义序列化吗?也许这只会序列化到资源文件。我找不到太多文档,因为它不继承任何 Windows 窗体控件基类。
更新
将属性[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
放入List<T>
属性中会为每个List<T>
项目提供一个资源。
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
可以提供帮助。