C#如何使用列表类作为自定义窗体的属性

时间:2018-11-11 17:56:33

标签: c# visual-studio propertyeditor

我正在尝试为自定义表单创建一个由List<>组成的属性。请在下面查看我的代码:

//Property of Custom Form
public ParametersList Parameters { get; set; }

public class ParametersList : List<Parameter>
{
    private List<Parameter> parameters = new List<Parameter>();
    public void AddParameter(Parameter param)
    {
        parameters.Add(param);
    }
}

public class Parameter
{
    public String Caption { get; set; }
    public String Name { get; set; }
}

属性 Parameters 现在出现在自定义窗体上,但是问题是当我单击Parameters属性的Ellipsis并添加一些列表时,当我按Ok按钮时,该列表没有保存。因此,每当我按Ellipsis时,列表就会很清楚。

以下是我要实现的目标的一个示例:
image

2 个答案:

答案 0 :(得分:0)

Igor的注释确定了问题所在,仅使用List<Parameter>而不是自定义类。这是为什么我认为是问题所在:

您的表单正在向ParametersList的项目添加内容,而不是向List<Parameter>的私有ParametersList内部 添加项目。

因此您的类是一个参数列表(通过继承),而则有一个参数列表(通过封装)。似乎您所需要的只是存储参数的集合,因此我完全不需要自定义类。

答案 1 :(得分:0)

您希望在自定义控件中列出Parameter个对象。只需在控件上提供List<Parameter>属性即可完成此操作。这是使用用户表单的示例:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        ParameterList = new List<Parameter>();
    }

    [Category("Custom")]
    [Description("A list of custom parameters.")]
    public List<Parameter> ParameterList { get; }
}

scr1

您的主要问题是,在设计表单时添加到列表中的项目在运行应用程序时不会保留。这是可以预期的,因为设计人员不会将控件的完整设计状态保存在表单中。它主要保存位置,名称和样式,但不保存内容。

在从文件,数据库或以编程方式加载表单时,您将需要填写列表。这应该在OnLoad()方法中完成:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        ParameterList.Add(new Parameter() { Name="First", Caption="The first parameter" });
    }

对于这样的事情,我更喜欢序列化到一个XML文件中,该XML文件在加载表单时自动加载,并在表单关闭时自动保存。但这是另一个问题的讨论话题。

您可以通过创建要使用的自定义列表类(而非List<Parameter>)来改善视觉效果。

[TypeConverter(typeof(ExpandableObjectConverter))]
public class CustomParameterList : System.Collections.ObjectModel.Collection<Parameter>
{
    public override string ToString() => $"List With {Count} Items.";
    public void Add(string name, string caption) => Add(new Parameter() { Name = name, Caption = caption });
}

您可以控制课程

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        ParameterList = new CustomParameterList();
    }

    [Category("Custom")]
    [Description("A list of custom parameters.")]
    public CustomParameterList ParameterList { get; }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        ParameterList.Add("First", "The first parameter");
    }

}

这将创建以下内容:

scr2

scr3