从另一个表单填写一个表单

时间:2013-03-11 20:38:35

标签: c# winforms

我的项目中有两个表单,一个是按钮,第二个是两个文本框。 当我点击第一个表单按钮时,我想在另一个表单中填充文本框。

代码:

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中输入数据,为什么?

1 个答案:

答案 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;