如何从form2更新form1中的文本框?

时间:2011-11-01 16:27:30

标签: c# winforms textbox

我有2个Windows窗体。

首先,主窗口形式有多行文本框和一个按钮。该按钮打开第二个表单,我可以使用AddEntry对象将数据添加到数组。

在第二种形式中,我有文本框和一个按钮(btnAddEntry),它应该从第一个表单更新文本框的内容。

输入数据时,我想在第一个表单的文本框中显示数据。

问题是我提出的代码似乎不起作用。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

要使BASIC正常工作,请执行以下操作。创建一个新项目。没有你当前的代码,窗口等...默认项目将创建一个表单“Form1”暂时不管它。

向项目添加一个新表单,它将默认为“Form2”...在其上放置一个文本框,并在其上放置一个按钮。对于grins和澄清以区分对象名称,将Form2上的控件名称更改为“txtOnForm2”和“btnOnForm2”(对于我的示例区分大小写,并且可读性与“txtonform2”全部小写)。现在,在表单上,​​右键单击并单击“查看代码”。它将带您进入其他“Partial class”声明,其中包含您的构造函数。添加以下内容,不要担心编译错误,因为另一半将是我们将代码放入Form1下一步...

// specifically typecasting the TYPE of form being passed in, 
// not just a generic form.  We need to see the exposed elements
Form1 CalledFrom;
// Ensure to do the : this() to make sure default behavior
// to initialize the controls on the form are created too.
public Form2(Form1 viaParameter) : this()
{
  CalledFrom = viaParameter;
}

private void btnOnForm2_Click(object sender, EventArgs e)
{
  CalledFrom.ValuesByProperty = this.txtOnForm2.Text;
  MessageBox.Show( "Check form 1 textbox" );

  string GettingBack = CalledFrom.ValuesByProperty;
  MessageBox.Show( GettingBack );

  CalledFrom.SetViaMethod( "forced value, not from textbox" );
  MessageBox.Show( "Check form 1 textbox" );

  GettingBack = CalledFrom.GetViaMethod();
  MessageBox.Show( GettingBack );
}

保存并关闭Form2设计器和代码窗口。

现在,打开Form1。在其上放置一个文本框和一个按钮。控件的默认名称分别为“textbox1”和“button1”。保持原样。双击按钮(在form1上)。它将显示该按钮的代码片段。粘贴以下

private void button1_Click(object sender, EventArgs e)
{
   Form2 oFrm = new Form2(this);
   oFrm.Show();
}

public string ValuesByProperty
{
  get { return this.textBox1.Text; }
  set { this.textBox1.Text = value; }
}

public void SetViaMethod(string newValue)
{ this.textBox1.Text = newValue; }

public string GetViaMethod()
{ return this.textBox1.Text; }

现在,保存表单并运行它们。单击第一个表单上的按钮,使用已创建的自身实例调用第二个,而不是自己的新SECOND实例。将显示第二个表格。移动窗口,这样你就可以看到两者。

在文本框第二个窗口中输入一些文本,然后单击按钮...按照即将进行的内容的来回跟进。

答案 1 :(得分:1)

其他时候都有答案,类似的原则......

查看similar question

要从“Form2”到“Form1”“传回”信息,您需要在其上创建一个公共方法以显示您想要触摸的内容。然后从第二个表单(它基本上有一个指针实例到第一个表单,用你想做的任何事情调用该方法/行动。这也可以通过做一个公共财产来处理。

从你可能已经有的工作......

public partial class YourFirstForm
{
    // example to expose a method on first form and pass IN a value
    public void SetMyObject( string ValueFromSecondForm )
    {
       this.txtBox1.Text = ValueFromSecondForm;
    }

    // example via a property you are trying to set... identical in results
    public string ViaSetAsProperty
    { set { this.txtBox1.Text = value; } }

    // Now, the reverse, lets expose some things from form 1 to the second...
    public string GetMyObjectText()
    {
       return this.txtBox1.Text;
    } 

    // or via a GETTER property... 
    public string GettingText
    { get { return this.txtBox1.Text; } }


    // However, if you want to allow both set and get to form 1's values, 
    // do as a single property with both getter / setter exposed..
    public string TextContent
    {  get { return this.txtBox1.Text; }
       set { this.txtBox1.text = value; }
    }
}

现在,如何从你的SECOND表格中获取

公共部分类YourSecondForm {     表格ObjRefToFirstForm;

public YourSecondForm( Form passedInVar )
{
   // preserve the first form
   ObjRefToFirstForm = passedInVar;
}

// Now, however you want to handle... via a button click, the text change event, etc
public void SendDataToForm1()
{
   // via calling the METHOD on form 1 that is public
   ObjRefToFirstForm.SetMyObj( this.SomeOtherTextbox.Text );

   // via a SETTER on form 1
   ObjRefToFirstForm.ViaSetAsProperty = this.SomeOtherTextbox.Text;


   // sample to GET something from form 1 via method
   string TestGet = ObjRefToFirstForm.GetMyObjectText();

   // or from the exposed property
   TestGet = ObjRefToFirstForm.GettingText;


   // Now, try via the one property that has both a setter and getter
   ObjRefToFirstForm.TextContent = this.SomeOtherTextbox.Text;
   TestGet = ObjRefToFirstForm.TextContent;
}

}

希望这能够为您提供在表单之间获取和设置内容的方法...作为方法()方法和/或通过属性获取/设置。

答案 2 :(得分:1)

你的问题是MainWindow mainWindow = new MainWindow()创建一个新版本的MainWindow,而不是对现有版本的引用。在MainWindow表单中,打开第二个表单时,需要将引用传递给第二个表单,方法是将它传递给Show方法(将其存储在一个名为owner类型的变量的变量中),如下所示:

AddEntryWindow addEntryWindow = new AddEntryWindow();
addEntryWindow.ShowDialog(this);

然后你可以像这样引用文本框:

foreach (AddEntry list in addedEntry)
{
     // Displaying and formating the output in text box in MainWindow.         
     ((MainWindow)owner).txtDisplayFileContent.Text += txtUserName.Text;
}