1

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

代码:

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

4

1 回答 1

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();
}

因此,只有在我们还没有实例的情况下才会创建一个新实例,我们每次都填充数据,然后聚焦表单。

PS第一次聚焦表格没什么问题,所以我在结束后就离开了if。如果有什么事情只应该在不是第一次发生时发生,我们可以添加一个else并将if代码放在那里。

PSSsecondForm不遵循类名称的标准命名约定。类名应以大写字母开头,即SecondForm. 除其他问题外,这消除了secondForm是指类型还是类型实例的歧义。

PSSS 在您的情况下可能不需要功能,但我们可能需要正确处理关闭子窗体然后再次单击按钮的情况。处理此问题的最简单方法是在表单关闭时清除secondForm实例字段(如果发生这种情况,则在下次单击按钮时创建一个新字段)。闭包使这变得非常容易,我们只需在之前添加这一行secondForm.Show();

secondform.FormClosed += (s, arg) => secondform = null;
于 2013-03-11T20:43:38.030 回答