2013-03-03 55 views
2

我对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包含“开始f2” - 正如所料。但是当事件进入时,textBox1中的文本不会改变。嘟嘟声得到充分发挥 - 所以方法sendString()被称为好吧。

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

f2,顺便说一句,是MyClass一个私有成员:

private Form2 f2; 
+0

你是什么意思'似乎没有工作'。它是否编译?你实际上是否收到错误信息? 'tetBox1'是'form2'的公共成员? – 2013-03-03 22:33:21

+1

请显示**一些**的代码 - 但不是两个窗体的''.cs'文件的完整转储。 – Yuck 2013-03-03 22:34:07

+0

[表单之间共享数据]的可能重复(http://stackoverflow.com/questions/3800603/sharing-data-between-forms) – 2013-03-03 22:35:26

回答

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(); 
+0

另请注意,OP将希望给该属性一个比“文本”更有意义的名称。首先,'Control'已经有一个'Text'属性,这会影响,这是......不受欢迎的,无论如何,它应该对文本代表什么更具描述性。 (显然只有OP知道他的情况。) – Servy 2013-03-04 14:49:00

0

默认情况下,当您通过设计师将它放在一个文本框是私人,这意味着您无法从Form2外部访问textBox1(它仅在Form2类中进行编码“可见”)。您可以改变文本框是内部的或公共的(这将让你做以下(从Form1中):

f2.tetBox1.Text = "Some text"; 

将被暴露窗体2的部分仅窗体2应该真正了解。因此它不是最干净的解决方案(虽然它可能是最快的解决方案))

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

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

随着法(或财产)位于Form2的,它可以访问到文本框中,因此它可以设置的值,而textBox1的还是私有的。

它的安全暴露这种方法来“外部”代码(而不是使文本显示给他们),因为所有他们能做的就是改变文本 - 而露出整个文本框可以让来电者试图改变背景颜色等