Я знаю, что тема довольно старая, но мне недавно пришлось искать ответы на этот точный вопрос.
Почему скрывает (дочернюю модальную) форму вместо закрытия это?
Я могу ошибаться, но я думаю, что в некоторых случаях иногда полезно скрыть модальную дочернюю форму вместо ее закрытия.
Например, я использую класс, представляющий собой пользовательское дерево сеток. Представьте себе что-то вроде документа Excel с несколькими таблицами (листами), и каждая таблица может иметь дочерние таблицы. Очень мощный способ хранения данных, которые могут использоваться несколькими объектами и несколькими формами одновременно.
Теперь этот объект «TreeTable_Class» имеет встроенную пользовательскую форму, которая фактически отображает содержимое одной из своих таблиц за раз в GridView, и вы можете выбрать, какую таблицу отображать, выбрав ее в TreeView. Здесь вы можете видеть, что «Редактор базы данных» на самом деле является формой MDI, которая может загружать форму из любого класса TreeTable_Class.

И это форма, которую я использую для редактирования содержимого ячейки для данной (выбранной) таблицы (я выбрал другую ячейку с длинным текстовым содержимым из другой таблицы в этой базе данных)

Теперь, когда вы решите закрыть пользовательскую форму, а не скрывать ее, эта форма будет недоступной , вы больше не сможете ее отобразить и получите исключение (нет экземпляра объекта) В некоторой степени, он еще не ликвидирован (поэтому проверка Если MyForm ничего не значит ... бесполезна) Я знаю, что мне нужно реализовать GarbageCollector и удалить дочернюю форму вручную, но это выходит за рамки эта тема.
В любом случае, мой класс мог бы использовать большой объем памяти, данных, и если бы мне приходилось перестраивать ВСЕ содержимое каждый раз, когда я хочу показать новый экземпляр этой формы, это было бы большое количество рабочей нагрузки в моем приложении. Вот почему я выбрал скрыть форму вместо закрытия до тех пор, пока не закроется основное приложение или когда явно не будет вызван определенный метод CloseFormAndDispose (), либо программой, либо если я сделайте эту опцию доступной для пользователя через пользовательский интерфейс.
Попытка обхода:
Это обходной путь, который я нашел, чтобы переопределить форму ", замененную другой, потому что ни один из родительских / дочерних не мог быть извлечен ":
Извините, я в VB .. но вы можете использовать инструмент для преобразования этого в C # или сделать это вручную, это довольно просто ..
// This is the child, a Cell Editor that can edit the content of a Cell.
Protected WithEvents _CellEditor As CellEditor_Form = Nothing
Эта форма редактора является членом TreeTable_Form, формы, которая может фактически отображать и редактировать содержимое всего файла базы данных (одного файла)
И этот класс TreeTable_Form содержит подпрограмму, которая обрабатывает событие закрытия CellEditor
Public Partial Class TreeTable_Form
// Sorry. The "WithEvents" in C# is a litte bit complex to me... So, in VB :
Protected WithEvents _CellEditor As CellEditor_Form = Nothing
// ...
// CellEditor handling method (I used a Code converter...) :
// The original VB declaration is :
// Protected Sub RecallFormAfterCellEditorHidden() Handles _CellEditor.Closed
// You'll have to write specific Event handler for _CellEditor object declared above...
protected void RecallFocusAfterCellEditorHidden()
{
Application.DoEvents();
this.Focus();
}
End Class
Этот крошечный защищенный метод vall RecallFormAfterCellEditorHidden () в вашем классе (если вы используете класс, содержащий формы) или в вашем основном из , при условии, что ваша основная форма содержит дочерние формы (диалоги) будут пытаться сосредоточить внимание на вашем приложении или MainForm ...
Кстати, TreeTable_ Form на самом деле является компонентом TreeTable_ Class . Последнее - это объект, который можно использовать где угодно. В приложении главной формы, в другом классе, в диалоге, где угодно ... и может передаваться по ссылке, чтобы разделить его содержимое между несколькими элементами. И этот TreeTable_Class содержит RecallFocusAfterTreeViewerHidden () метод, который обрабатывает закрытие этой формы. Это означает, что форма или приложение, которое фактически использует класс, будет получать фокус каждый раз, когда вы закрываете его дочернюю форму. Я сделал это таким образом, чтобы получить объект, который можно использовать где угодно
У нас все еще проблемы!
Однако этот метод заставит ваше приложение немного мерцать при каждом закрытии дочернего диалогового окна, и не получится при 100% !Иногда моя родительская форма все еще исчезает с экрана и попадает в другое окно.Alt + TAB тоже не поможет.Но это случается реже, чем без этого трюка метода.У меня нет лучшего ответа в это время, я все еще ищу ... Я вернусь сюда, если узнаю как.Я использую это специальное приложение в своей работе, например, для написания заметок во время собраний и выпускаю PV (устное - французское извинение) в PDF или DOCx на лету ...
И я извиняюсьЯ в VB, а не в C #.Надеюсь, это немного поможет, пока мы не найдем лучший обходной путь для этого ...