我对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;
答案 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仍然是私有的。
将此方法暴露给“外部”代码更安全(而不是让文本框对它们可见),因为他们只能更改文本 - 而暴露整个文本框可能会让调用者尝试更改背景颜色等。