C# 将窗体传递给另一个类并提取控件和属性

C# 将窗体传递给另一个类并提取控件和属性,c#,winforms,C#,Winforms,这与其说是我的问题,不如说是一个一般性的问题。我有一个包含30多个控件的表单,我将使用它来填充一个模型,该模型最终会出现在一个数据库中 但是,我想知道是否可以将整个表单对象传递给另一个类,并在另一个类中提取内容,而不设置一大堆getter和setter 假设我有一张表格Form1,我打这个电话: OtherClass.Validate(this) 然后,在OtherClass中(在同一解决方案的不同项目中),我有: 我已经玩过一点了。在Validate()方法中,如果我在myForm上放置一个

这与其说是我的问题,不如说是一个一般性的问题。我有一个包含30多个控件的表单,我将使用它来填充一个模型,该模型最终会出现在一个数据库中

但是,我想知道是否可以将整个表单对象传递给另一个类,并在另一个类中提取内容,而不设置一大堆getter和setter

假设我有一张表格Form1,我打这个电话:

OtherClass.Validate(this)
然后,在OtherClass中(在同一解决方案的不同项目中),我有:


我已经玩过一点了。在Validate()方法中,如果我在
myForm
上放置一个手表,我可以看到所有的表单控件和属性,但我不知道是否有办法将它们拉出。如果我键入
myForm.
,intellisense会显示所有标准表单方法和属性,但不会显示特定于表单的控件和属性。有人成功尝试过吗?

您可以使用

myForm.Controls
这将为您提供表单中的控件集合。您可以使用foreach循环遍历它们

此示例包含两个按钮。您可以使用以下代码获取控件文本

public static void Validate(Form1 myForm)
{
    foreach (Control control in myForm.Controls)
    {
        string text = control.Text;
        Console.WriteLine(text);
    }
}
触发上述功能会将以下信息打印到控制台

按钮2

按钮1


此方法也适用于TextBox和其他控件。但是,如果控件中包含控件,则可能会更复杂。您可以通过创建递归函数来解决此问题。

表单上的每个控件都有一个名为“修饰符”的属性:

默认情况下,它是“私有的”(原因是:UI是最有可能发生更改的对象,表单之外的任何逻辑都不应依赖于控件。一个控件可以替换为另一个控件,一组控件可以替换为自定义控件。当控件为公共控件时,此类更改不会被封装,并触发系统许多部分的更改)

添加到表单上的控件将序列化为form.designer.cs文件中的C#代码。textBox1的代码(如果具有专用修饰符):

private System.Windows.Forms.TextBox textBox1;
将其更改为公共,如屏幕截图所示,它将成为

public System.Windows.Forms.TextBox textBox1;
公共控件将像任何其他公共字段一样可访问:

public static void Validate(Form1 myForm)
{
    if (String.IsNullOrEmpty(myForm.textBox1.text))
    {
        // do smth about empty field
    }
}

没有WCF表单,我猜你是指WPF?请更改标记。为什么不传递模型而不是表单,因为我猜只有模型需要验证?通常只传递需要传递的内容。为一个以表单为输入并验证控件的方法编写测试将是一场绝对的噩梦。模型是w是的,我是在编写代码,但我只是好奇你是否能传递表单。你是对的,这个方法几乎是不稳定的。我实际上没有想到会有那么远,因为我真的不打算这样编写代码。很好。
public static void Validate(Form1 myForm)
{
    if (String.IsNullOrEmpty(myForm.textBox1.text))
    {
        // do smth about empty field
    }
}