我的项目中有两个表单,一个是按钮,第二个是两个文本框。 当我点击第一个表单按钮时,我想在另一个表单中填充文本框。
代码:
secondForm secondForm = new secondForm();
secondForm.MdiParent = this.MdiParent;
secondForm.fillForm("String");
if (formShown != true)
{
secondForm.Show();
formShown = true;
}
else
{
Application.OpenForms[secondForm.Name].Focus();
}
和
public void fillForm(string text)
{
if (String.IsNullOrEmpty(priceText1.Text))
{
priceText1.Text = text;
}
else
{
priceText2.Text = text;
}
}
看起来很简单,但是当我第二次单击按钮时,它没有检测到第二个表单文本框中的文本并在textbox1而不是textbox2中输入数据,为什么?
答案 0 :(得分:1)
问题在于,当您第二次单击该按钮时,您正在创建表单的第二个实例,然后只是不显示它(您正在关注第一个实例)。你应该重构程序,这样你就不会这样做。
private secondform secondform = null;
private void Foo()
{
if(secondForm == null)
{
secondForm = new secondForm();
secondForm.MdiParent = this.MdiParent;
secondForm.Show();
}
secondForm.fillForm("String");
secondForm.Focus();
}
因此,只有在我们还没有实例的情况下才创建新实例,我们每次都填充数据,然后关注表单。
P.S。第一次聚焦表单没有任何问题,所以我只是在if
结束后离开了它。如果有些内容只有在我们第一次向else
添加if
并将代码放在那里时才会发生。
P.S.S。 secondForm
未遵循类名称的标准命名约定。类名应以大写字母开头,即SecondForm
。除其他问题外,这消除了secondForm
是否引用类型或类型实例的模糊性。
P.S.S.S。在您的情况下可能不需要它,但我们可能需要正确处理子表单关闭的情况,然后再次单击该按钮。处理此问题的最简单方法是在窗体关闭时清除secondForm
实例字段(如果发生这种情况,则在下次单击该按钮时创建一个新字段)。闭包使这非常简单,我们只需在secondForm.Show();
之前添加此行:
secondform.FormClosed += (s, arg) => secondform = null;