【问题标题】:How to update data in form2 without create new instance of form2如何更新form2中的数据而不创建form2的新实例
【发布时间】:2021-10-10 02:07:12
【问题描述】:

这只是我想测试的一个简单的东西

我有两种形式(Form1 和 Form2)

在 Form1 中有:

文本框和按钮

当我点击 Form1 中的按钮时,Form2 中只有 TextBox 用于 displayData

问题是当我单击按钮时将数据发送到 Form2,但每次单击它都会创建一个新表单。有什么方法可以在不创建新的情况下更新 Form2 中的数据。

代码如下:

In Form1:

private void sendBt1_Click(object sender, EventArgs e) //sendBt1 is button in Form1
        {
           
            Form2 f2 = new Form2(typeBox1.Text);//typeBox1 is TextBox in Form1 use to type
            f2.Show();
            
        }

在 Form2 中:

public Form2(string data)
        {
            InitializeComponent();`enter code here`
            this.ds2.Text = data;  //ds2 is textBox in Form2 that i wanna display
        }

有人可以帮忙吗?我有点卡住了 :)

【问题讨论】:

  • 只需使用单例(例如 Form2 中的静态变量 public readonly Instance = new Form2();)或单个实例(private Form2Instance = new Form2(); 作为 Form1 类的实例成员 - 与单例不同,您如果您愿意,将能够在任何地方创建其他实例,因此如果只需要一个实例,请使用单例,否则在 Form1 中使用静态变量)而不是每次单击按钮时创建表单的对象实例...

标签: c# forms winforms user-interface


【解决方案1】:

正如已经评论的那样,有很多方法可以完成这项工作。正如您所描述的,当前代码正在创建多个Form2 对象,因为每次单击Form1 按钮时,代码都会创建一个新的Form2

Form2 f2 = new Form2(typeBox1.Text);

此外,您希望将typeBox1 TextBox 中的“TEXT”传递给Form2TextBox ds2。但是,当前代码会执行此操作,如果 Form1 中的 typeBox1 TextBox 中的文本发生更改,则 Form2 (ds2) 中的 TextBox 不会更新。同样,有很多方法可以解决这个问题,但是,我建议为Form2TextBox 创建一个DataBinding,这样如果typeBox1 TextBoxForm1 中发生变化,那么TextBox Form2中的ds2会同时自动更新,用户无需做任何事情。

下面的示例使用这种DataBinding 方法并按照描述的方式工作......

我可能在这里遗漏了一些东西,但是,在我的测试中,一种方法是简单地“检查”以查看 Form2 是否已经打开。如果Form2 已打开……那么,我们不需要做任何事情,因为我们的代码在Form2 的构造函数中为文本框设置了数据绑定。由于Form2 IS OPEN 它可能会被最小化,因此,如果用户单击Form1Form2 IS OPEN 上的按钮,那么我们会将表单状态设置回正常状态,这将基本上恢复表单。此外,代码将调用表单Show() 方法,以防表单以某种方式被隐藏。

如果Form2 未打开,那么显然我们需要像您当前的代码一样创建它,但是,不要只传入来自TextBox 的文本,我建议您发送整个TextBox 来自From1Form2。这样,我们可以为Form2TextBox设置DataBinding,并将Form2TextBox绑定到从Form1传入的TextBox。当Form1TextBox 发生变化时,这将自动更新Form2TextBox ds2

因此我建议您将Form1sendBt1_Click 事件中的代码更改为...

private void sendBt1_Click_Click(object sender, EventArgs e) {
  var form = Application.OpenForms["Form2"];
  if (form == null) {
    form = new Form2(typeBox1);
  }
  form.Show();   // <- in case the form is somehow hidden
  form.WindowState = FormWindowState.Normal;  // <- in case the form is minimized
}

注意:在上面的代码中,我们将整个 TextBox 传递给 From2,而不仅仅是 TextBox 中的文本。

那么Form2 的构造函数可能看起来像……。

public Form2(TextBox f1TextBox) {
  InitializeComponent();
  ds2.DataBindings.Add("Text", f1TextBox, "Text");
}

这应该就是您所需要的。当Form1的文本框文字发生变化时,Form2的文本框会自动更新。

【讨论】:

  • 你用什么app来录制gif?看起来它比我使用的做得更好
  • @Caius Jard ...该应用程序是免费的或至少是一个淡化版本,名为 LICEcap。
  • @JohnG 谢谢我在找什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多