Как закрыть и открыть форму из другой формы? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть список со списком сотрудников, и когда вызывается событие selected index changed, открывается новая форма с некоторой информацией о сотруднике, такой как адрес электронной почты, имя, местоположение. Но когда щелкает другой пользователь, я хочу, чтобы предыдущая форма закрыла и открыла нового выбранного сотрудника.

Это текущий код, который я использую, чтобы попытаться закрыть форму, а затем снова открыть ее, но я получаюошибка вызова dispose:

System.ObjectDisposedException: 
"Cannot access a disposed object. Object name: 'EmployeeInfoPopup'.

Код находится внутри события EmployeeListBox_SelectedIndexChanged.

EmployeeInfoPopup popup = new EmployeeInfoPopup();
if(popup.Enabled == true)
{
     popup.Dispose();
     popup.employeePopupLayout(employeeListBox.SelectedIndex);
     popup.Show();
}
else
{
     popup.employeePopupLayout(employeeListBox.SelectedIndex);
     popup.Show();
}

Этот метод вызывается в форме EmployeeInfoPopup

public void employeePopupLayout(int currentEmployeeIndex)
{
     SeatingChart_2_0 seatingChart = new SeatingChart_2_0();
     employeeLabel.Text = ($"Name: {seatingChart.employeesNames[currentEmployeeIndex]}\nEmail: {seatingChart.employeesEmails[currentEmployeeIndex]}\nBuilding: {seatingChart.employeesBID[currentEmployeeIndex]}\nFloor: {seatingChart.employeesFID[currentEmployeeIndex]}\nSeat: {seatingChart.employeesSID[currentEmployeeIndex]}");
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вы можете попробовать этот шаблон:

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.

Дайте мне знать ваш случай, и я обновлю код.

0 голосов
/ 08 октября 2019

Если экземпляр Dispose d

 popup.Dispose();

, вы больше не сможете его открыть (все необходимые ресурсы, такие как Handle, освобождены )

 popup.Show(); // <- Will throw exception

Вы можете попытаться выяснить, есть ли открытая EmployeeInfoPopup форма (и Close она):

  using System.Linq;

  ... 

  // Close the last opened EmployeeInfoPopup if it exists
  Application
    .OpenForms
    .OfType<EmployeeInfoPopup>()
    .LastOrDefault()
   ?.Close();

Если вы хотите удалить все такие формы:

   var forms = Application
      .OpenForms
      .OfType<EmployeeInfoPopup>()
      .ToArray();

   foreach (var form in forms)
     form.Close();

А затем создайте и откройте новый EmployeeInfoPopup istance

  // Create a new EmployeeInfoPopup instance
  EmployeeInfoPopup popup = new EmployeeInfoPopup(); 

  popup.employeePopupLayout(employeeListBox.SelectedIndex);
  popup.Show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...