在类和窗体之间传递值
本文关键字:之间 窗体 | 更新日期: 2023-09-27 18:02:14
我对c#很陌生,但到目前为止一切都很顺利。
我从一个表单和一个类开始,它完成了大部分工作(非静态和在程序部分)。我以表单1的形式实例化类的对象并进行登录。
然后切换到下一个表单form2。实际上,这个类就是这样做的。这里有一个方法,它包含了
这一行this.f2 = new Form2();
然后:
f2.Show();
f2是Form2类型的类成员——到目前为止,一切正常。
这个Form2只是由一个大文本框组成,我想在其中显示网络事件。事件处理程序工作得很好-但是对表单的引用似乎不起作用。如果我做
f2.tetBox1.Text = "Some text";
它只是不会改变文本框中的文本。
我在这里做错了什么?
下面是对我正在做的事情的更详细的描述:
Form1
传递一些登录信息给myProg
,作为MyClass
的一个实例。如果登录成功,Form1调用myProg.makeForm();
MyClass中的方法如下:
public void makeForm() {
this.f2 = new Form2();
f2.Show();
this.sendString("start f2");
}
这是MyClass.sendString()
:
private void sendString(string text) {
SystemSounds.Beep.Play();
this.f2.setTextBox(text);
}
如您所见,这调用Form2
的setTextBox()
-我在这里按照建议实现。奇怪的是,到目前为止,一切都很顺利。Form2显示一个textBox1包含"start f2"-如预期。但是当事件发生时,textBox1中的文本不会改变。
我观察到的一件事:如果在调用this.f2.setTextBox(text);
之后放置哔哔声,则如果从事件处理程序调用该方法,则不会播放。
f2
, btw。,是MyClass
的私有成员:
private Form2 f2;
任何由设计器创建的控件(例如在设计时从工具箱中删除的控件)都会自动设置为私有。因此,您不能从其他形式访问它。
你不想打乱设计器,而是在Form2
上创建一个属性,允许你从Form1
修改文本框的文本。
一个简短的例子是这样的:
Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
// When modifying the Text property it will change the text in textbox1
public string Text
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
}
然后,在Form1中:
Form2 frm2 = new Form2();
frm2.Text = "123"; // Uses the public Text property declared in Form2
frm2.Show();
默认情况下,当你通过设计器放置文本框时,文本框是私有的,这意味着你不能从Form2外部访问textBox1(它只对Form2类中的代码"可见")。您可以将文本框更改为内部或公共(这将允许您执行以下操作(从Form1):
f2.tetBox1.Text = "Some text";
BUT会暴露Form2中只有Form2才知道的部分…所以它不是最干净的解决方案(尽管它可能是最快的))
一个更好的解决方案可能是在Form2中创建一个方法或属性(内部或公共)来设置文本值。例如:
internal void SetText(string value)
{
textBox1.Text = value;
}
由于该方法(或属性)驻留在Form2中,因此它可以访问文本框,因此它可以在textBox1仍然是私有的情况下设置值。
将此方法暴露给"外部"代码(而不是使文本框对他们可见)更安全,因为他们所能做的就是更改文本-而暴露整个文本框可能会让调用者尝试更改背景颜色等