表单在自定义事件处理程序中多次实例化

时间:2018-05-09 14:30:10

标签: c# winforms

我遇到了一个问题,我确信这是一个简单的修复,但我是WinForms的新手。我正在构建一个应用程序,当双击列表视图项时,该应用程序需要能够从主窗体和列表视图窗体实例化一个功能完整的输入窗体。从主窗体实例化可以很好地工作,但是当我尝试从列表视图窗体中实例化时,我得到了窗体的多个实例。好像以前的实例被添加到某个列表中,并且无论我多次在列表视图中双击,都会打开多少个新输入窗口。

我怀疑它可能与以下事实有关:我将自定义事件处理程序从列表视图表单链接到主窗体,然后从主窗体链接到输入窗体。

这是将列表视图表单传递给主表单的自定义事件处理程序:

private void listView1_DoubleClick(object sender, EventArgs e)
{
    MainMenuForm mainMenuForm = Application.OpenForms[0] as MainMenuForm;

    selectedCharacter = listView1.SelectedItems[0].Tag as Character;

    CharDoubleClick += mainMenuForm.HandleCharDoubleClick;

    if(CharDoubleClick != null)
    {
        CharDoubleClick(this, new EventArgs());
    }
}

此处,提取列表视图表单中的选定字符并将其传递到输入表单以填充其字段:

public void HandleCharDoubleClick(object sender, EventArgs e)
{
    CharListForm extractForm = new CharListForm();
    extractForm = sender as CharListForm;

    selectedCharacter = extractForm.SelectedCharacter;

    CharCreatorForm characterCreator = new CharCreatorForm();

    CharDoubleClick += characterCreator.HandleCharDoubleClick;
    characterCreator.CharCreatorFormClosed += HandleCharCreatorFormClosed;

    if (CharDoubleClick != null)
    {
        CharDoubleClick(this, new EventArgs());
    }

    characterCreator.Show();
}

在此处,所选字符将被提取到输入表单中并填充字段:

public void HandleCharDoubleClick(object sender, EventArgs e)
{
    MainMenuForm extractForm = sender as MainMenuForm;
    Character selectedCharacter = extractForm.SelectedCharacter;

    PopulateFields(selectedCharacter);
}

除了第二次双击列表视图,实例化两个输入表单,第三次出现在第三次尝试,四次出现在第四次等等这一事实时,所有内容都按预期工作。

0 个答案:

没有答案