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

时间:2011-06-10 18:35:43

标签: c# winforms

我有一个WinForms应用程序,可以创建一个巨大的自定义文本文件。要执行此操作,用户需要在主窗体上配置许多控件,然后单击“提交”按钮。将所有控制值传递给Generator类的最佳方法是什么?问题是我最终有20多个参数传递给Generate()方法。我可以将其中的一些组合成Config对象(即日期/时间控件可以传递到DateTimeConfig对象),然后将这些配置对象传递给Generate()方法,以最小化所需的参数数量,但它仍然感觉必须有更好的方法。有什么想法吗?

编辑:感谢您的回复,但我希望得到的不是配置对象(就像我提到的那样)。我想我想要的是一些自动序列化所有控件的值的方法,而不必构建自定义对象,然后每次控件更改或添加/删除时都修改它。

5 个答案:

答案 0 :(得分:4)

为什么不创建自定义对象类作为数据的容器,然后将此类的istance作为参数传递给Generator方法?

答案 1 :(得分: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);
}

因此,如果我想向该人添加一个State,我只需更改Address类,并且我只需一步完成,我就不必将state字段添加到所有方法参数列表中:

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

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

答案 2 :(得分: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或任何其他垃圾。它只关心价值是什么。

答案 3 :(得分:1)

创建容器类。保持它的主要表单的常见实例以及将要使用它的任何形式/将其作为参数传递给其他表单或类。

从表单中获取所有值并填充容器类。通常,容器/实体类将充满属性,并且只有很少的方法。

答案 4 :(得分:0)

将Generate()方法移动到类并使用类属性。然后,您还可以从表单支持数据绑定。

实施例。

拿这个

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

到此

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