如何更新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”传递给Form2
的TextBox
ds2
。但是,当前代码会执行此操作,如果 Form1
中的 typeBox1
TextBox
中的文本发生更改,则 Form2
(ds2
) 中的 TextBox
不会更新。同样,有很多方法可以解决这个问题,但是,我建议为Form2
的TextBox
创建一个DataBinding
,这样如果typeBox1
TextBox
在Form1
中发生变化,那么TextBox
Form2
中的ds2
会同时自动更新,用户无需做任何事情。
下面的示例使用这种DataBinding
方法并按照描述的方式工作......
我可能在这里遗漏了一些东西,但是,在我的测试中,一种方法是简单地“检查”以查看 Form2
是否已经打开。如果Form2
已打开……那么,我们不需要做任何事情,因为我们的代码在Form2
的构造函数中为文本框设置了数据绑定。由于Form2
IS OPEN 它可能会被最小化,因此,如果用户单击Form1
和Form2
IS OPEN 上的按钮,那么我们会将表单状态设置回正常状态,这将基本上恢复表单。此外,代码将调用表单Show()
方法,以防表单以某种方式被隐藏。
如果Form2
未打开,那么显然我们需要像您当前的代码一样创建它,但是,不要只传入来自TextBox
的文本,我建议您发送整个TextBox
来自From1
到 Form2
。这样,我们可以为Form2
的TextBox
设置DataBinding
,并将Form2
的TextBox
绑定到从Form1
传入的TextBox
。当Form1
的TextBox
发生变化时,这将自动更新Form2
的TextBox
ds2
。
因此我建议您将Form1
的sendBt1_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的新实例的主要内容,如果未能解决你的问题,请参考以下文章
Delphi在Form1中通过一个按钮动态创建窗体Form2 怎么做
Delphi中Form1中有按钮,点击按钮,调用Form2,此时希望Form1关闭,如何解决?