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