Вы можете попробовать этот шаблон:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
static private Dictionary<int, EmployeeInfoPopup> EmployeeInfoForms
= new Dictionary<int, EmployeeInfoPopup>();
private void EmployeeListBox_SelectedIndexChanged(object sender, EventArgs e)
{
int index = EmployeeListBox.SelectedIndex;
if ( EmployeeInfoForms.ContainsKey(index) )
{
EmployeeInfoForms[index].Close();
}
else
{
EmployeeInfoPopup popup = new EmployeeInfoPopup();
EmployeeInfoForms.Add(index, popup);
popup.employeePopupLayout(index);
popup.Show();
}
}
static internal void EmployeeInfoPopupClosed(EmployeeInfoPopup sender)
{
var key = EmployeeInfoForms.FirstOrDefault(v => v.Value == sender).Key;
if ( key != null )
EmployeeInfoForms.Remove(key);
}
Мы используем словарь открытого EmployeeInfoPopup, основанного на индексе элемента списка.
Это позволяет вам открывать несколько форм одновременно, если вы изменитеClose
от Show
.
Затем мы проверяем, создана ли форма, чтобы закрыть (или показать) ее или создать, инициализировать и открыть ее.
На FormClosed
событие EmployeeInfoPopup
, добавьте:
TheFormWithTheListBoxClassName.EmployeeInfoPopupClosed(this);
Это прекрасно работает, если у вас есть только один экземпляр TheFormWithTheListBoxClassName, в противном случае для управления экземплярами с помощью словаря предыдущего словаря, для которого требуется словарь, требуется больше кода. TheFormWithTheListBoxClassName.
Дайте мне знать ваш случай, и я обновлю код.