C# 在WinC窗体中从以前的窗体获取值

C# 在WinC窗体中从以前的窗体获取值,c#,winforms,public,C#,Winforms,Public,我有两个表单,由大约20个文本框组成,我想保存所有20个条目,并在第三个表单中全部显示,每个表单都以不同的标签显示,我已经将所有20个数据保存在单个公共静态stringglobal变量中,但拥有20个静态全局变量会占用大量内存并降低程序运行速度,是否有其他方法保存这些数据并将其单独存储在标签中 以下是我尝试过的: 第一种形式: public static string place_of_application; public static string gender; private void

我有两个表单,由大约20个文本框组成,我想保存所有20个条目,并在第三个表单中全部显示,每个表单都以不同的标签显示,我已经将所有20个数据保存在单个公共静态stringglobal变量中,但拥有20个静态全局变量会占用大量内存并降低程序运行速度,是否有其他方法保存这些数据并将其单独存储在标签中

以下是我尝试过的:

第一种形式:

public static string place_of_application;
public static string gender;

private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
    place_of_application = PlaceOfApplication.Text;
    gender = identity.Text;
    ...
}
第二种形式:

private void PrintTemplateForm_Load(object sender, EventArgs e)
{
    label36.Text = userform2.place_of_birth;
    label34.Text = userform2.gender;
    ...    
}

感谢您的帮助

一种方法是在Visual Studio的第一个窗体和属性窗口中选择所有文本框,我猜您使用此IDE转到Modifiers属性并从列表中选择Public

或者,您可以直接编辑Form1.Designer.cs文件并将所有您想要的文本框从Private更改为Public,然后您可以直接从第二个表单访问它们,如下所示:

Form1 frm=新Form1; frm.ShowDialog; 如果frm.DialogResult==DialogResult.OK label1.Text=frm.textBox1.Text;
假设你有两种形式,主要形式和次要形式。在main中有一堆文本框,单击一个按钮,您希望从这些文本框中获取数据,并将其显示在表单2中

首先,我将定义一个类,该类表示要发送/接收的数据。这似乎是某种个人数据,所以让我们创建一个Person类:

显然,您将在类中拥有所有您想要的20个属性,而不仅仅是这两个

现在的想法是从文本框中抓取数据并保存在该对象的实例中。接下来,在要启动的第二个表单中,让我们在构造函数中传递Person对象。因此,第二个表单后面的代码如下所示。我们将把那个人的信息保存在表单2中,然后显示在它的标签上

public partial class SecondForm : Form
{
    public Person Person { get; set; }

    public SecondForm(Person person)
    {
        InitializeComponent();
        Person = person;
    }

    private void SecondForm_Load(object sender, EventArgs e)
    {
        lblName.Text = Person.Name;
        lblAge.Text = Person.Age.ToString();
    }
}
现在在主窗体中,当单击按钮时,我们将把数据保存到Person类的实例中,然后将其传递到SecondForm的构造函数中,然后显示它

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var person = new Person();
        person.Name = txtName.Text;
        if (int.TryParse(txtAge.Text, out int age))
        {
            person.Age = age;
        }

        var form2 = new SecondForm(person);
        form2.Show();
    }
}
我想你有。您要求的是一个非常具体的问题,而您的问题对于应用程序的体系结构来说要普遍得多

推荐

尝试利用C的面向对象特性,构建一个数据模型,即包含所有数据的类。然后您可以传递这个类,或者实际上是从一个表单到另一个表单的类引用。每个表单将负责从数据模型填充自己的文本框,或从文本框生成数据模型的新实例

作为一个额外的好处,您可以使用数据绑定来自动化数据模型和UI(即文本框)之间的同步

我强烈建议您阅读一本关于windows编程的书,或者查找带有示例的在线资源。[SO]不是学习如何正确构建windows应用程序的好地方

范例

数据模型是保存数据的类

public class PersonalInformation
{
    public string PlaceOfApplication { get; set; }
    public string Gender { get; set; }
    // .. more here
}
主窗体可以通过PersonalInformation对象接收或发送数据

在第二种形式中,创建一个方法来接收数据

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public void SetPersonalInformation(PersonalInformation value)
    {
        placeOfApplictionLabel.Text = value.PlaceOfApplication;
        genderLabel.Text = value.Gender;
    }
}
在第一个表单中,通过准备信息并将信息发送到第二个表单来处理按钮按下

public partial class Form1 : Form
{
    ...

    private void secondFormButton_Click(object sender, EventArgs e)
    {
        var dlg = new Form2();
        dlg.SetPersonalInformation(this.PersonalInformation);

        if (dlg.ShowDialog(this) == DialogResult.OK)
        {
            // user pressed OK in second form
        }
    }
}
测试过程


拥有20个静态全局变量会占用大量内存并降低程序的运行速度。20个字符串不可能对程序的性能产生任何可测量的影响。当然,您可以在FormClosing事件处理程序中这样做。存储20个全局变量不会降低程序的运行速度,但我同意这是不雅观的。您可以使用具有20个属性的类。或者,如果20个文本框在逻辑上相似,请使用数组/列表。请咨询。另外,“拥有20个静态全局变量”是非常不寻常的,您可能做错了什么。发布你的代码。你需要显示你的代码。我们一事无成。只需注意,只有在表单仍然打开的情况下,此操作才有效。。
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public void SetPersonalInformation(PersonalInformation value)
    {
        placeOfApplictionLabel.Text = value.PlaceOfApplication;
        genderLabel.Text = value.Gender;
    }
}
public partial class Form1 : Form
{
    ...

    private void secondFormButton_Click(object sender, EventArgs e)
    {
        var dlg = new Form2();
        dlg.SetPersonalInformation(this.PersonalInformation);

        if (dlg.ShowDialog(this) == DialogResult.OK)
        {
            // user pressed OK in second form
        }
    }
}