C# 在类和窗体之间传递值

C# 在类和窗体之间传递值,c#,forms,class,C#,Forms,Class,我对C#很陌生,但到目前为止一切都进行得很顺利 我从一个表单和一个类开始,它完成了大部分工作(非静态的,在程序部分)。我以表单1实例化了类的一个对象,并进行了登录 然后我切换到下一个表单,表单2。事实上,这门课就是这么做的。我有一个方法,它包含以下行: this.f2 = new Form2(); 然后: f2.Show(); f2是Form2类型的类成员—到目前为止,所有这些都可以正常工作 这个表单2由一个大文本框组成,我想在其中显示网络事件。事件处理程序工作得很好,但是对表单的引用似乎不

我对C#很陌生,但到目前为止一切都进行得很顺利

我从一个表单和一个类开始,它完成了大部分工作(非静态的,在程序部分)。我以表单1实例化了类的一个对象,并进行了登录

然后我切换到下一个表单,表单2。事实上,这门课就是这么做的。我有一个方法,它包含以下行:

this.f2 = new Form2();
然后:

f2.Show();
f2是Form2类型的类成员—到目前为止,所有这些都可以正常工作

这个表单2由一个大文本框组成,我想在其中显示网络事件。事件处理程序工作得很好,但是对表单的引用似乎不起作用。如果我这样做

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()

如您所见,这调用了
Form2
setTextBox()
——我按照这里的建议实现了它。奇怪的是,到目前为止一切都很好。表单2显示一个textBox1包含“开始f2”-如预期的那样。但是当一个事件出现时,textBox1中的文本不会改变。嘟嘟声可以正常播放-因此方法sendString()可以正常调用

我观察到的一件事是:如果在调用
this.f2.setTextBox(text)之后放置了蜂鸣声行,如果从事件处理程序调用该方法,则不会播放

f2
,顺便说一句,是
MyClass
的私人成员:

private Form2 f2;

设计器创建的任何控件(例如,在设计时从工具箱中删除)都会自动设置为私有。因此,您无法从其他窗体访问它

相反,您不想开始干扰设计器-在
Form2
上创建一个属性,它将允许您从
Form1
修改文本框的文本

下面是一个简短的例子:

表格2:

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; }
    }
}
然后,在表1中:

Form2 frm2 = new Form2();
frm2.Text = "123"; // Uses the public Text property declared in Form2
frm2.Show();

默认情况下,当您通过设计器放置textbox时,它是私有的,这意味着您无法从Form2外部访问textbox 1(它仅对Form2类中的代码“可见”)。您可以将文本框更改为内部或公共(这将允许您执行以下操作(从表单1):

但这会暴露出Form2中只有Form2才应该真正了解的部分……因此它不是最干净的解决方案(尽管它可能是最快的))

更好的解决方案可能是在Form2中创建一个方法或属性(内部或公共),用于设置文本值。例如:

internal  void SetText(string value)
{
   textBox1.Text = value;
}
由于方法(或属性)位于Form2中,因此它可以访问文本框,因此可以在textBox1仍然是私有的情况下设置值


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

你所说的
是什么意思似乎不起作用
。它编译吗?你真的收到错误信息了吗?
tetBox1
form2
的公共成员吗?请显示部分代码,但不是两个表单的
.cs
文件的整个转储。编辑时可能会出现重复:您订阅的事件处理程序是什么?如果它没有在UI线程中触发,那么这就是您的问题。事件处理程序是我正在使用的库(openmetaverse)的一部分。我不完全明白你在这里说什么。这一切都发生在MyClass中,事件处理程序调用函数-它会发出嘟嘟声。还要注意,OP希望给属性一个更有意义的名称,而不仅仅是
Text
。首先,
控件
已经有了一个
文本
属性,这会产生阴影,这是不可取的,而且在任何情况下,它都应该更能描述文本所代表的内容。(显然只有OP知道他的情况。)
f2.tetBox1.Text = "Some text";
internal  void SetText(string value)
{
   textBox1.Text = value;
}