在FORM1中,我有一个包含占位符文本的文本框。单击时,将弹出第二个表单(FORM2),其中包含可供选择的项目列表。他们选择他们的选择并按下SELECT和FORM2关闭,FORM1的文本框将填充他们从FORM2的选择。
这就是我所拥有的:
FORM1 -
// Variables
public string ID{ get; set; }
private void openF2_Click(object sender, EventArgs e)
{
FORM2 f2 = new FORM2();
f2.Show();
// updateText(); <-- when called through here, ID is still empty.
}
public void updateText()
{
textBox1.Text = ID;
// textBox1.Refresh(); <-- I thought this would work
}
// Check if it did change
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.BackColor = Color.White;
}
FORM2 -
private void btnSelect_Click(object sender, EventArgs e)
{
FORM1 f1= new FORM1();
f1.ID = listOfChoices.SelectedItems[0].SubItems[0].ToString();
f1.updateText();
this.Close();
}
当我浏览代码时,我看到ID正确设置,当FORM2调用“updateText()”时,它将textbox1值设置为ID,textChanged函数也运行,但在GUI上,它仍然是空的
答案 0 :(得分:1)
问题是,您要从Form1
创建Form2
的新实例,并在其上设置属性,但只要您的Form2
消失,那么它创建的实例。
在您的情况下,解决此问题的最简单方法是将您的Form2
显示为对话框 - 这意味着Form1
暂停时所有执行都会暂停。然后,当Form2
关闭时,您仍然可以从Form1
访问它的属性,因为Form1
上的执行会从它停止的位置再次获取。这意味着如果我们在Form2
上创建公共属性并将其设置为用户选择的值,我们可以稍后访问它。
以下是一种方法:
<强>窗体2 强>
让我们创建一个名为ChosenItem
的公共属性,然后我们将其设置为用户选择的项目:
public partial class Form2 : Form
{
public string ChosenItem = "Some default text";
private void btnSelect_Click(object sender, EventArgs e)
{
ChosenItem = listOfChoices.SelectedItems[0].SubItems[0].ToString();
this.Close();
}
// Rest of form code omitted...
}
<强> Form1中强>
启动Form2
作为对话框,然后在关闭后从表单中设置我们的值:
public partial class Form1 : Form
{
private void openF2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
textBox1.Text = f2.ChosenItem;
}
// Rest of form code omitted...
}