4

我对 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;
4

2 回答 2

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();
于 2013-03-03T22:49:02.790 回答
0

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

f2.tetBox1.Text = "Some text";

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

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

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

由于方法(或属性)位于 Form2 中,因此它可以访问文本框,因此它可以在 textBox1 仍为私有时设置值。

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

于 2013-03-03T22:49:34.457 回答