如何更新form2中的数据而不创建form2的新实例

Posted

技术标签:

【中文标题】如何更新form2中的数据而不创建form2的新实例【英文标题】:How to update data in form2 without create new instance of 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
        

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

【问题讨论】:

这能回答你的问题吗? How to avoid multiple instances of windows form in c# 和 Windows Forms, Designer, and Singleton 只需使用单例(例如 Form2 中的静态变量 public readonly Instance = new Form2();)或单个实例(private Form2Instance = new Form2(); 作为 Form1 类的实例成员 - 与单例不同,您如果您愿意,将能够在任何地方创建其他实例,因此如果只需要一个实例,请使用单例,否则在 Form1 中使用静态变量)而不是每次单击按钮时创建表单的对象实例... 【参考方案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 谢谢我在找什么!

以上是关于如何更新form2中的数据而不创建form2的新实例的主要内容,如果未能解决你的问题,请参考以下文章

C# form2如何用form1中的数据

Delphi在Form1中通过一个按钮动态创建窗体Form2 怎么做

Delphi中Form1中有按钮,点击按钮,调用Form2,此时希望Form1关闭,如何解决?

Delphi7中实现单击Form1中的按钮,弹出Form2并进行Form2中的下一步操作?!

C#如何在form1中显示Form2中的变量?

如何根据ListView中的数据打开某个TabPage?