Лучший способ передать контрольные значения из формы в отдельный класс - PullRequest
4 голосов
/ 10 июня 2011

У меня есть приложение WinForms, которое создает огромный пользовательский текстовый файл. Для этого пользователю необходимо настроить десятки элементов управления в главной форме, а затем нажать кнопку «Отправить». Каков наилучший способ передать все эти контрольные значения моему классу Generator? Проблема в том, что я получаю более 20 параметров для передачи в метод Generate(). Я могу сгруппировать некоторые из них в объекты Config (т. Е. Элементы управления датой / временем можно передать в объект DateTimeConfig), а затем передать эти объекты конфигурации в метод Generate(), чтобы минимизировать количество необходимых параметров, но все равно как должно быть лучше. Есть идеи?

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы, но я надеялся на что-то другое, чем объект конфигурации (как это то, что упомянул мой OP). Я думаю, что я надеялся, что это какой-то способ автоматически сериализовать значения всех элементов управления, без необходимости создания пользовательского объекта, а затем изменять его при каждом изменении или добавлении / удалении элемента управления.

Ответы [ 5 ]

4 голосов
/ 10 июня 2011

Почему бы не создать пользовательский класс объекта в качестве контейнера ваших данных, а затем передать его значение методу Generator в качестве параметра?

2 голосов
/ 10 июня 2011

Изучите управляемую моделью разработку, где параметры сгруппированы в бизнес-объекты или объекты передачи данных (DTO).Это более интуитивный способ группировки параметров, чем по дате и т. Д.

Если вы поместите эти объекты модели в отдельный проект, вы можете передать эти объекты вокруг решения (из одного метода в другой и из одного проекта вдругое) без необходимости их сериализации или работы с длинным списком параметров.Вы можете даже вкладывать объекты модели в другие объекты модели.

В этом примере обратите внимание, что вам нужно только изменить параметры в объекте Person или объекте Address, и вам никогда не придется сериализовать или отображать что-либо:

// this is my business model object
public class Person
{
    public int PersonId { get; set; }
    public string PersonName { get; set; }

    // notice the Address object nested in the Person class
    public Address HomeAddress { get; set; }
}

// this is another class that lives inside the person class
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

В одном классе вы можете иметьэтот метод, который получает человека с адресом и передает его в класс SavePerson другого класса:

public void ProcessPerson(Person person)
{
    person.PersonName = "Robert";

    Address address = new Address();
    address.City = "Austin";

    person.Address = address;

    SavePerson(person);
}

Какой-то другой класс (даже в другом проекте) может взять этого человека и передать его на уровень постоянства:

public void SavePerson(Person person)
{
    database.Save(person);
}

Так что, если я хочу добавить State к человеку, я просто изменяю класс Address и все готово за один шаг, мне не нужно добавлять поле состояния ко всем параметрам методасписки:

 public class Address
 {
    public string Street { get; set; }
    public string City { get; set; }

    //  this is the new property
    public string State  { get; set; }
 }
1 голос
/ 10 июня 2011

Создать контейнерный класс.Держите экземпляр этого общего для вашей основной формы, и любая форма будет использовать его / передавать его другой форме или классу в качестве параметра.

Возьмите все значения из вашей формы и заполните класс контейнера.Обычно класс контейнера / сущности будет полон свойств и будет иметь очень мало методов.

1 голос
/ 10 июня 2011

Создайте объект модели, который имеет значение для каждого элемента управления.

Допустим, у вас есть форма с именем, фамилией, днем ​​рождения и зарплатой.

Ваша модель будетbe

public class SalaryModel
{
     public string FirstName {get; set;}
     public string LastName {get; set;}
     public DateTime Birthday {get; set;}
     public decimal Salary {get; set;}
}

Затем при нажатии кнопки submit вы создаете этот объект и передаете его в свой класс генератора.

Одной из причин этого является то, что вашему генератору не нужно знать НИЧЕГО о контроле, кроме его значения.То есть класс генератора не должен беспокоиться о .IsVisible() или .TabOrder или о любом другом мусоре.Его волнует только значение.

0 голосов
/ 10 июня 2011

Переместите метод Generate () в класс и используйте свойства класса. Затем вы также можете поддерживать привязку данных из вашей формы.

Ex.

Возьми это

Generate (List<int> x, bool Opt1);

к этому

public class Generate
{
     List<int> Ids {get;set;}
     bool Opt1 {get;set;}
     bool Generate();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...