C # Как использовать список класса в качестве свойства пользовательской формы - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь создать свойство, составленное из 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; }
}

Свойство Параметры теперь отображается в пользовательской форме, но проблема заключается в том, что, когда я щелкаю многоточие свойства «Параметры» и добавляю некоторый список, список не сохраняется, когда я нажимаю кнопку «ОК». Поэтому каждый раз, когда я нажимаю на многоточие, список становится чистым.

Вот пример того, чего я пытаюсь достичь:
image

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы хотите список 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-файл, который загружается автоматически при загрузке формы и автоматически сохраняет при закрытии формы. Но это тема для обсуждения другого вопроса.

Вы можете улучшить визуальные эффекты, создав собственный класс списка для использования вместо 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

0 голосов
/ 03 декабря 2018

Комментарий Игоря определяет проблему, просто используйте List<Parameter>, а не пользовательский класс. Вот почему Я думаю, что это проблема:

Ваша форма добавляет элементы к ParametersList, а НЕ к личному List<Parameter> внутри из ParametersList.

Таким образом, ваш класс представляет собой список параметров (через наследование), а AND имеет список параметров (через инкапсуляцию). Похоже, все, что вам нужно, это хранить набор параметров, поэтому я не вижу необходимости в собственном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...