【问题标题】:getting values from previous forms in c# winforms在 c# winforms 中从以前的表单中获取值
【发布时间】:2020-02-06 00:25:58
【问题描述】:

我有 2 个表单,由大约 20 个文本框组成,我想保存所有 20 个条目并以第 3 个表单显示它们,每个都显示在不同的标签中,我已将所有 20 个数据保存在单独的 public static stringglobal 变量中,但是有 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;
    ...    
}

感谢您的帮助

【问题讨论】:

  • “拥有 20 个静态全局变量会占用大量内存并降低程序速度” 20 个字符串不可能对您的程序性能产生任何可衡量的影响。跨度>
  • 当然,您可以在 FormClosing 事件处理程序中执行此操作。
  • 存储 20 个全局变量不应该减慢你的程序,但我同意它不优雅。您可以使用具有 20 个属性的类来代替。或者如果 20 个文本框在逻辑上相似,则使用数组/列表。
  • 咨询Pass Data From One Form to Another。此外,“有 20 个静态全局变量”是非常不寻常的,你可能做错了什么。发布您的代码。
  • 您需要出示您的代码。我们无处可去。

标签: c# winforms public


【解决方案1】:

假设您有两种形式,主要形式和次要形式。您在 main 中有一堆文本框,单击按钮后,您希望从中获取数据并在表单 2 中显示它们。

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

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

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

现在的想法是从文本框中获取数据并保存在该对象的实例中。接下来,在您要启动的第二种形式中,让我们在构造函数中传递一个Person 对象。所以后面的第二种形式的代码将如下所示。我们将Person信息保存在表格二中,然后显示在它的标签上。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 请注意,这仅在表单仍处于打开状态时才有效..
    【解决方案3】:

    我想你有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. 测试进程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      相关资源
      最近更新 更多