Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将控件值从窗体传递到单独类的最佳方法_C#_Winforms - Fatal编程技术网

C# 将控件值从窗体传递到单独类的最佳方法

C# 将控件值从窗体传递到单独类的最佳方法,c#,winforms,C#,Winforms,我有一个WinForms应用程序,可以创建一个巨大的自定义文本文件。为此,用户需要在主窗体上配置几十个控件,然后单击提交按钮。将所有这些控制值传递给Generator类的最佳方式是什么?问题是我最终要将20多个参数传递给Generate()方法。我可以将其中的一些对象分组到配置对象中(即,可以将日期/时间控件传递到DateTimeConfig对象中),然后将这些配置对象传递到Generate()方法中,以最小化所需的参数数量,但感觉必须有更好的方法。有什么想法吗 编辑:感谢您的回复,但我希望得到

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


编辑:感谢您的回复,但我希望得到的不是配置对象(正如我的OP所提到的)。我想我所希望的是自动序列化所有控件的值,无需构建自定义对象,然后在每次控件更改或添加/删除时修改该对象。

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

将Generate()方法移动到一个类并利用类属性。然后还可以支持表单中的数据绑定

拿着这个

Generate (List<int> x, bool Opt1);
Generate(列表x,bool Opt1);
对此

public class Generate
{
     List<int> Ids {get;set;}
     bool Opt1 {get;set;}
     bool Generate();
}
公共类生成
{
列表ID{get;set;}
bool Opt1{get;set;}
bool生成();
}

创建一个模型对象,每个控件都有一个值

假设你有一个表格,上面有名字、姓氏、生日和薪水

你的模型是

public class SalaryModel
{
     public string FirstName {get; set;}
     public string LastName {get; set;}
     public DateTime Birthday {get; set;}
     public decimal Salary {get; set;}
}
然后,单击submit时,创建此对象并将其传递给generator类


这样做的一个原因是,除了控件的值之外,生成器不需要知道任何关于控件的信息。这是一个生成器类,不应该关心
.IsVisible()
.TabOrder
或任何其他垃圾。它只关心值是什么。

创建一个容器类。为您的主窗体和任何要使用它的窗体保留一个通用实例/将其作为参数传递给其他窗体或类


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

查看模型驱动开发,其中参数被分组为业务对象或数据传输对象(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);
}
因此,如果我想向person添加一个状态,我只需更改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; }
 }

这就是我现在所做的。我将这20多个控件组合成4-5个配置对象,然后将它们组合成一个主配置对象,并将主配置传递给Generate方法。这是可行的,但每次我做修改,我有很多部分要修复。我希望有一种我不知道的序列化方法。