Где я могу управлять поведением кнопки закрытия "X" в правом верхнем углу winform?

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

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

Public theModelessDialog As New dlgModeless

Чтобы запустить немодальное диалоговое окно, я вызываю

theModelessDialog.Show()

и внутри обработчиков кнопок OK и Cancel в 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"
  • Поймайте событие, чтобы я не выбрал объект (просто обработайте его, как будто я ударил Cancel)

Любые идеи?

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Поймайте событие FormClosing и, если причиной является UserClosing, установите Cancel для события в 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

Ответ 3

событие 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

Ответ 4

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

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.

Ответ 5

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

Ответ 6

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

Закрытое подчинение FORM1_FormClosing (отправитель как объект, e As FormClosingEventArgs) Обрабатывает Me.FormClosing

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

Конец Sub

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