Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio designer不为“列表”生成代码<;T>;``Windows.Forms.Control'的成员`_C#_Winforms_Visual Studio 2010_Visual Studio Designer - Fatal编程技术网

C# Visual Studio designer不为“列表”生成代码<;T>;``Windows.Forms.Control'的成员`

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

以下类(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; }
    }
}
对于
列表视图

        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());