我有2个Windows窗体。
首先,主窗口形式有多行文本框和一个按钮。该按钮打开第二个表单,我可以使用AddEntry对象将数据添加到数组。
在第二种形式中,我有文本框和一个按钮(btnAddEntry),它应该从第一个表单更新文本框的内容。
输入数据时,我想在第一个表单的文本框中显示数据。
问题是我提出的代码似乎不起作用。
我该如何解决这个问题?
答案 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)
其他时候都有答案,类似的原则......
要从“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;
}