Где я могу контролировать поведение кнопки закрытия "X" в верхнем правом углу winform? - PullRequest
16 голосов
/ 15 мая 2010

Я решаюсь сделать приложение VB.NET немного более удобным, сделав некоторые формы немодальными.

Мне кажется, я понял, как использовать dlg.Show () и dlg.Hide () вместо вызова dlg.ShowDialog (). У меня есть экземпляр моего немодального диалога в основной форме приложения:

Public theModelessDialog As New dlgModeless

Для запуска немодального диалога я звоню

theModelessDialog.Show()

и в обработчиках кнопок OK и Отмена в dlgModeless у меня есть

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.OK
    Me.Hide()
End Sub

Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
    Me.Hide()
End Sub

и это, кажется, работает нормально.

Кнопка «X» в правом верхнем углу меня все же получает. Когда я закрываю форму с помощью этой кнопки, а затем пытаюсь снова открыть форму, я получаю

Исключение ObjectDisposedException не обработано. Невозможно получить доступ к удаленному объекту.

Мне кажется, что я в основном там, но не могу понять, как сделать одно из следующих действий:

  • Скрыть эту кнопку "X"
  • Перехватите событие, чтобы я не избавлялся от объекта (просто обработайте его, как если бы я нажал Отмена)

Есть идеи?

Класс этого диалога System.Windows.Forms.Form.

Ответы [ 6 ]

21 голосов
/ 15 мая 2010

Перехватите событие FormClosing и, если причиной является UserClosing, установите для отмены события значение true.

Примерно так:

Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _ 
     Handles Form1.FormClosing

    if e.CloseReason = CloseReason.UserClosing then
        e.Cancel = true
        Me.Hide()
    end if

End Sub
4 голосов
/ 15 мая 2010

Используйте Me.Close(), чтобы скрыть форму. Чтобы открыть его, используйте следующий фрагмент:

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

Если вы сохраняете данные, вам нужно найти какой-то способ их хранения (возможно, в виде статической переменной / с в форме). Это правильный способ сделать то, чего вы пытаетесь достичь.

Вы также должны простить меня, если мой VB выключен, это было давно.

1 голос
/ 13 февраля 2017

@ Джон скрывал форму в своем коде, и ответы, приведенные выше, дают решение для этого случая. Однако, часто вы не планируете использовать форму снова, поэтому вы действительно делаете хотите, чтобы форма была удалена. Все действия, связанные с закрытием, будут в одном месте, если вы обработаете событие FormClosing с помощью Me.FormClosing, добавив его в любой код отмены / закрытия / выхода, который у вас уже есть. например в случае @ Джона:

Private Sub Cancel_Button_Click(ByVal sender As System.Object, _ 
                                     ByVal e As System.EventArgs) _
                                 Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub

Обратите внимание на использование Me.Dispose вместо любых существующих Me.Close. Если вы оставите Me.Close, вы создадите бесконечный цикл. См. это для тонких различий между Close и Dispose .

1 голос
/ 06 апреля 2012

событие formclosing позволяет мне выполнить управляемый выход из формы, поэтому я включил вопрос для подтверждения выхода. У меня также есть флаг формы bterminate, чтобы вызвать отмену, где я хочу, и, следовательно, не задавать вопрос. Спасибо, ваше предложение мне тоже помогло:)

    Dim msgboxresponse As MsgBoxResult

    If e.CloseReason = CloseReason.UserClosing Then
        If Not Me.bTerminate Then
            msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
                                MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
            If msgboxresponse <> MsgBoxResult.Yes Then
                e.Cancel = True
                Return
            End If
        End If
    End If
0 голосов
/ 09 декабря 2016

Я попробовал все, и это не сработало если вы просто хотите закрыть, не показывая окно сообщения, вам просто нужно:

Закрытая подпрограмма FORM1_FormClosing (отправитель как объект, e как FormClosingEventArgs) обрабатывает Me.FormClosing

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)

End Sub

Надеюсь, это поможет вам ...!

0 голосов
/ 15 мая 2010

Согласитесь с обработкой события FormClosing. Или измените свойства в форме, чтобы скрыть элемент управления X системы.

...