Onde eu controlo o comportamento do botão "X" de fechamento no canto superior direito de um Winform?
-
27-09-2019 - |
Pergunta
Estou me aventurando em tornar meu aplicativo vb.net um pouco melhor para usar, tornando alguns dos formulários modificados.
Acho que descobri como usar dlg.show () e dlg.hide () em vez de ligar para dlg.showdialog (). Eu tenho uma instância da minha caixa de diálogo modificada no meu formulário de inscrição principal:
Public theModelessDialog As New dlgModeless
Para disparar o diálogo moda que eu chamo
theModelessDialog.Show()
e dentro dos manipuladores de botões OK e cancelar dlgModeless
Eu tenho
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
E isso parece funcionar bem.
O botão "X" no canto superior direito está me pegando. Quando fecho o formulário com esse botão e tento reabrir o formulário, eu entendo
ObjectDisposedException não tinha conhecimento. Não pode acessar um objeto descartado.
Sinto que sou a maior parte do caminho, mas não consigo descobrir como fazer nenhum dos seguintes:
- Esconder aquele botão "x"
- Pegue o evento para que eu não descarte o objeto (apenas trate -o como se eu tivesse cancelado)
Alguma ideia?
A classe desta caixa de diálogo é System.Windows.Forms.Form
.
Solução
Usar Me.Close()
para esconder a forma. Para abri -lo, use o seguinte snippet:
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
Se isso estiver salvando dados, você precisará calcular uma maneira de armazená -los (talvez em uma variável estática no formulário). Esta é a maneira correta de fazer o que você está tentando alcançar.
Você também terá que me perdoar se meu VB estiver de folga, já faz um tempo.
Outras dicas
Pegue o evento FormClosing e, se o motivo for um userclosing, o Set Cancel no evento como TRUE.
Algo como o seguinte:
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
O evento FormClosing me permite fazer uma saída gerenciada do formulário, por isso incluí uma pergunta para confirmar para sair. Eu também tenho um Formulário Bandiminato para forçar o cancelamento onde eu quero e, portanto, não faço a pergunta. Obrigado, sua sugestão também me ajudou :)
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
@John estava escondendo o formulário em seu código e as respostas acima fornecem uma solução para esse caso. Muitas vezes, porém, você não está planejando usar o formulário novamente, então você realmente Faz deseja que o formulário seja descartado. Todas as atividades relacionadas próximas estarão em um só lugar se você lidar com o evento de formulário usando Me.FormClosing
Adicionando -o ao código de qualquer pessoa/fechamento/saída que você já possui. por exemplo, no caso de @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
Observe o uso do Me.Dispose
em vez de qualquer existente Me.Close
. Se você deixar o Me.Close
Você criará um loop infinito. Ver isso para as diferenças sutis entre fechar e descartar.
Concordo em lidar com o evento FormClosing. Ou altere as propriedades no formulário para ocultar o controle do sistema X.
Eu tentei de tudo e não funcionou se você só quiser fechar, sem mostrar uma caixa de mensagem, você só precisará:
Sub Sub -Form1_FormClosing (remetente como objeto, e como formClosingEventargs) me lida.
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
Final sub
Espero que isso ajude você...!