C# 如何使用List Class as 属性 of Custom Form
C# How to use List Class as Property of Custom Form
我正在尝试为自定义表单创建一个由 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; }
}
属性参数现在出现在自定义表单上,但问题是当我单击参数属性的省略号并添加一些列表时,当我按下确定按钮时,列表没有保存。所以每次我按省略号,列表就很清楚了。
这是我正在努力实现的示例:
Igor 的评论指出了问题,只需使用 List<Parameter>
而不是自定义 class。 原因 我认为这是问题所在:
您的表单正在向 ParametersList
添加项目,而不是向 ParametersList
的私有 List<Parameter>
inside 添加项目。
所以你的class是一个参数列表(通过继承),并且有一个参数列表(通过封装)。似乎您只需要存储一组参数,所以我根本看不到自定义 class 的必要性。
您需要自定义控件中的 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; }
}
您的主要问题是您在设计表单时添加到列表中的项目在应用程序 运行 时不会保留。这是意料之中的,因为设计者不会将控件的完整设计状态保存在窗体中。主要保存位置、名称和样式,不保存内容。
您需要在加载表单时从文件、数据库或以编程方式填写列表。这应该在 OnLoad()
方法中完成:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ParameterList.Add(new Parameter() { Name="First", Caption="The first parameter" });
}
对于这样的事情,我更喜欢序列化到一个 XML 文件中,该文件在加载表单时自动加载,并在表单关闭时自动保存。但这是另一个问题的讨论话题。
您可以通过创建自定义列表 class 代替 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 });
}
并且您控制 class
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");
}
}
创建以下内容:
我正在尝试为自定义表单创建一个由 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; }
}
属性参数现在出现在自定义表单上,但问题是当我单击参数属性的省略号并添加一些列表时,当我按下确定按钮时,列表没有保存。所以每次我按省略号,列表就很清楚了。
这是我正在努力实现的示例:
Igor 的评论指出了问题,只需使用 List<Parameter>
而不是自定义 class。 原因 我认为这是问题所在:
您的表单正在向 ParametersList
添加项目,而不是向 ParametersList
的私有 List<Parameter>
inside 添加项目。
所以你的class是一个参数列表(通过继承),并且有一个参数列表(通过封装)。似乎您只需要存储一组参数,所以我根本看不到自定义 class 的必要性。
您需要自定义控件中的 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; }
}
您的主要问题是您在设计表单时添加到列表中的项目在应用程序 运行 时不会保留。这是意料之中的,因为设计者不会将控件的完整设计状态保存在窗体中。主要保存位置、名称和样式,不保存内容。
您需要在加载表单时从文件、数据库或以编程方式填写列表。这应该在 OnLoad()
方法中完成:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ParameterList.Add(new Parameter() { Name="First", Caption="The first parameter" });
}
对于这样的事情,我更喜欢序列化到一个 XML 文件中,该文件在加载表单时自动加载,并在表单关闭时自动保存。但这是另一个问题的讨论话题。
您可以通过创建自定义列表 class 代替 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 });
}
并且您控制 class
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");
}
}
创建以下内容: