在类和表单之间传递值

时间:2013-03-03 22:30:09

标签: c# forms class

我对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);
}

如您所见,这会调用setTextBox() Form2 - 这是我在此处提出的。奇怪的是,到目前为止一切都运作良好。 Form2显示一个textBox1包含“start f2” - 正如预期的那样。但是当一个事件进来时,textBox1中的文本不会改变。嘟嘟声可以播放 - 所以方法sendString()被调用好了。

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

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

private Form2 f2;

2 个答案:

答案 0 :(得分:3)

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

您不想开始搞乱设计师,而是在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; }
    }
}

然后,在Form1中:

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

答案 1 :(得分:0)

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

f2.tetBox1.Text = "Some text";

但是会暴露Form2的部分,只有Form2应该真正知道...所以它不是最干净的解决方案(虽然它可能是最快的))

更好的解决方案可能是在Form2中创建一个方法或属性(内部或公共),它将设置文本值。 E.g:

internal  void SetText(string value)
{
   textBox1.Text = value;
}

由于方法(或属性)驻留在Form2中,它可以访问文本框,因此它可以设置值,而textBox1仍然是私有的。

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