Куда мне контролировать поведение кнопки закрытия «X» в верхнем правом праве WinForm?

StackOverflow https://stackoverflow.com/questions/2838979

Вопрос

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

Я думаю, что я понял, как использовать dlg.show () и dlg.hide () вместо звонка dlg.showdialog (). У меня есть экземпляр моего бесходного диалога в моей основной форме заявления:

Public theModelessDialog As New dlgModeless

Выстрелить безмоторное диалог, я звоню

theModelessDialog.Show()

и в рамках кнопок ОК и отменить в 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.

Это было полезно?

Решение

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

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

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

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

Другие советы

Поймите событие FormClizing и, если причина в зависимости от 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

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

    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

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

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 Вы создадите бесконечный цикл. Видеть Это для тонких различий между близкими и утилизирующими.

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

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

Частная Sub Form1_formclosing (отправитель в качестве объекта, е как формалкитериозеventargs) обрабатывает мне. Оформление

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

Конец подразделения

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top