从表单传递控制值到单独类的最佳方法

4
我有一个WinForms应用程序,可以创建一个非常大的自定义文本文件。要这样做需要用户在主窗体上配置几十个控件,然后单击“提交”按钮。传递所有这些控件值到我的生成器类的最佳方法是什么?问题是我最终会得到20多个参数传递给Generate()方法。我可以将其中一些分组成Config对象(即日期/时间控件可以传递到DateTimeConfig对象中),然后将这些Config对象传递到Generate()方法中,以最小化所需的参数数量,但仍然感觉必须有更好的方法。你有什么建议吗?
编辑:谢谢你们的回答,但我希望得到一些不同于配置对象的方法(因为这是我的原始帖子中提到的)。我猜我希望能够自动序列化所有控件的值,而不必构建自定义对象,并在每次控件更改或添加/删除时修改它。
5个回答

4
为什么不创建一个自定义对象类作为数据的容器,然后将该类的实例作为参数传递给生成器方法呢?

这是我现在做的。我已经将这20多个控件分成了4-5个配置对象,然后将它们全部分组到一个主配置对象中,并将主对象传递给生成方法。这样做可以工作,但每次我进行修改时都需要修复很多部分。希望有一种我不知道的序列化方法。 - BrazenTongue

2

了解模型驱动开发,其中参数被分组为业务对象或数据传输对象(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);
}

如果我想要给个人添加一个州,我只需更改地址类,一步到位,无需将州字段添加到所有方法参数列表中:

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

    //  this is the new property
    public string State  { get; set; }
 }

1
创建一个容器类。在主窗体和任何要使用它/将其作为参数传递给其他窗体或类的窗体中保留一个实例。
从表单中获取所有值并填充容器类。通常,容器/实体类将充满属性,并且只有很少的方法。

1
创建一个模型对象,为每个控件设置一个值。
假设您有一个表单,其中包括名字、姓氏、生日和薪水等信息。
您的模型将会是:
public class SalaryModel
{
     public string FirstName {get; set;}
     public string LastName {get; set;}
     public DateTime Birthday {get; set;}
     public decimal Salary {get; set;}
}

然后当提交被点击时,您创建此对象并将其传递给您的生成器类。

其中一个原因是您的生成器除了它的值之外不需要了解控件的任何信息。这意味着生成器类不应该关心.IsVisible().TabOrder等其他无关紧要的内容。它只关心值是什么。


0
将Generate()方法移动到一个类中并利用类属性。然后,您还可以从表单支持数据绑定。
例如:
拿这个
Generate (List<int> x, bool Opt1);

变成这样

public class Generate
{
     List<int> Ids {get;set;}
     bool Opt1 {get;set;}
     bool Generate();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接