Где я могу управлять поведением кнопки закрытия "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
Надеюсь, это поможет вам...!