在类和窗体之间传递值

本文关键字:之间 窗体 | 更新日期: 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);
}

如您所见,这调用Form2setTextBox() -我在这里按照建议实现。奇怪的是,到目前为止,一切都很顺利。Form2显示一个textBox1包含"start f2"-如预期。但是当事件发生时,textBox1中的文本不会改变。

方法sendString()被正确调用。

我观察到的一件事:如果在调用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仍然是私有的情况下设置值。

将此方法暴露给"外部"代码(而不是使文本框对他们可见)更安全,因为他们所能做的就是更改文本-而暴露整个文本框可能会让调用者尝试更改背景颜色等