Onde eu controlo o comportamento do botão "X" de fechamento no canto superior direito de um Winform?

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

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.

Foi útil?

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ê...!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top