从c#winforms中的先前表单获取值

时间:2019-10-08 17:12:26

标签: c# winforms public

我有2种形式,由大约20个文本框组成,我想保存所有20个条目并以第3种形式显示它们,每一个都以不同的标签显示,我已经将所有20个数据保存在单独的public static string中全局变量,但是拥有20个static全局变量会占用大量内存并减慢程序速度,是否还有其他方法可以保存这些数据并将它们分别存储在标签中?

这是我尝试过的:

第一种形式:

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;
    ...    
}

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

假设您有两种形式,主要形式和次要形式。您的主体中有一堆文本框,然后单击一个按钮,您要从中获取数据并以表格2进行显示。

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

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

很显然,您将拥有所有想要的20种东西作为类的属性,而不仅仅是这两种。

现在的想法是从文本框中获取数据并保存在该对象的实例中。接下来,在您要启动的第二种形式中,让我们在构造函数中传递一个Person对象。因此,第二种形式的代码如下所示。我们将把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的构造函数中,然后显示它。 / p>

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();
    }
}

答案 1 :(得分:-1)

一种方法可能是选择第一个表单中的所有文本框,然后在Visual Studio的“属性”窗口中(我猜您使用的是IDE)转到“修饰符”属性,然后从列表中选择“公共”,

enter image description here

或者您可以直接编辑Form1.Designer.cs文件并将所需的所有文本框从“私人”更改为“公共”,然后可以从第二个表单直接访问它们,如下所示:

Form1 frm = new Form1();
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
    label1.Text = frm.textBox1.Text;

答案 2 :(得分:-1)

我认为您有the XY problem当您的问题在应用程序的体系结构中更加普遍时,您正在询问一个非常具体的问题。


推荐

尝试利用C#的面向对象功能并建立数据模型(即包含所有数据的类)。然后,您可以将此类(或实际上是对该类的引用)从一种形式传递到另一种形式。每个表单将负责根据数据模型填充自己的文本框,或根据文本框生成数据模型的新实例。

此设置的一个额外好处是,您可以使用数据绑定来自动执行数据模型和UI(即文本框)之间的同步。

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


示例

  1. 数据模型是保存数据的类

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

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        public PersonalInformation PersonalInformation
        {
            get
            {
                return new PersonalInformation()
                {
                    PlaceOfApplication = placeOfApplicationTextBox.Text,
                    Gender = genderTextBox.Text
                };
            }
            set
            {
                placeOfApplicationTextBox.Text = value.PlaceOfApplication;
                genderTextBox.Text = value.Gender;
            }
        }
    }
    
  3. 在第二种形式中,创建一种接收数据的方法

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
    
        public void SetPersonalInformation(PersonalInformation value)
        {
            placeOfApplictionLabel.Text = value.PlaceOfApplication;
            genderLabel.Text = value.Gender;
        }
    }
    
  4. 在第一个表单中,通过准备信息并将其发送到第二个表单来处理按钮的按下操作

    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
            }
        }
    }
    
  5. 测试过程

screenshot