2010-05-15 5 views
15

Ich wage es, meine VB.NET-Anwendung ein wenig besser zu machen, indem Sie einige der Formen nicht model.Wo kann ich das Verhalten der "X" -Schaltfläche oben rechts in einem WinForm steuern?

Ich denke, ich habe herausgefunden, wie dlg.Show() und dlg.Hide() statt dlg.ShowDialog() aufrufen. Ich habe eine Instanz meines modalen Dialogs in meinem Haupt-Bewerbungsformular:

Public theModelessDialog As New dlgModeless 

Um den modalen Dialog ich

nennen
theModelessDialog.Show() 

und innerhalb der OK anwerfen und Schaltfläche Handler Abbrechen in dlgModeless Ich habe

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 

und das scheint gut zu funktionieren.

Der "X" Knopf in der oberen rechten Ecke bringt mich jedoch. Wenn ich das Formular mit dieser Schaltfläche schließe, dann versuche, das Formular erneut zu öffnen, bekomme ich

ObjectDisposedException wurde nicht behandelt. Auf ein entsorgtes Objekt kann nicht zugegriffen werden.

Ich fühle mich wie die meisten der Weg dort bin, aber ich kann nicht herausfinden, wie eine der folgenden Funktionen ausführen:

  • ausblenden, dass „X“ -Taste
  • Fang das Ereignis also entsorge ich das Objekt nicht (behandle es einfach, wie ich auf Abbrechen klicke)

Irgendwelche Ideen?

Die Klasse dieses Dialogfelds lautet System.Windows.Forms.Form.

Antwort

4

Verwenden Sie Me.Close(), um das Formular auszublenden. Um mich zu öffnen, verwenden Sie den folgenden Ausschnitt:

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

Wenn dies Daten zu speichern, dann werden Sie brauchen einen Weg, um es zu speichern (vielleicht in einer statischen Variablen/s in Form). Dies ist der richtige Weg, um das zu erreichen, was Sie erreichen möchten.

Sie müssen mir auch verzeihen, wenn meine VB aus ist, es ist eine Weile her.

+0

Matthew, ich denke das ist es, wenn ich "Disposed" durch "IsDisposed" ersetze. Ich habe es versucht und es hat funktioniert. – John

+0

Ah, erinnere mich an Namen, die Fluch von jedem Coder .... –

21

Fangen Sie das FormClosing-Ereignis ab, und wenn der Grund UserClosing ist, setzen Sie Cancel für das Ereignis auf true.

Etwas wie folgt aus:

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 
+0

Danke für die Antwort Michael! – John

+0

Das ist großartig, funktioniert auf meinem Fall! –

0

Agree die Formclosing Ereignis mit der Handhabung. Oder ändern Sie die Eigenschaften des Formulars, um das System X-Steuerelement auszublenden.

1

Das formclosing-Ereignis ermöglicht es mir, einen verwalteten Exit des Formulars durchzuführen. Daher habe ich eine Frage eingegeben, um das Beenden zu bestätigen. Ich habe auch ein Formular Flag Bterminate, um den Abbruch zu zwingen, wo ich es will und daher nicht die Frage stellen.Dank Ihren Vorschlag half mir auch :)

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 
0

ich alles habe versucht, und es hat nicht funktioniert , wenn man nur schließen wollen, ohne eine messagebox zeigt, werden Sie brauchen nur:

private Sub FORM1_FormClosing (Absender als Gegenstand, e As FormClosingEventArgs) Griffe Me.FormClosing

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

End Sub

Hoffe, das hilft Ihnen ...!

1

@John versteckte das Formular in seinem Code und die Antworten bieten eine Lösung für diesen Fall. Häufig planen Sie jedoch nicht, das Formular erneut zu verwenden, so dass Sie wirklich das do möchten, das Formular zu Disposed. Wenn Sie das FormClosing-Ereignis unter Verwendung von Me.FormClosing behandeln, können Sie alle verwandten Aktivitäten schließen, indem Sie sie zu einem vorhandenen/Abbrechen-/Beenden-Code hinzufügen. z.B. in @ John Fall:

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 

Beachten Sie die Verwendung des Me.Dispose anstelle eines bestehenden Me.Close. Wenn Sie die Me.Close verlassen, erstellen Sie eine Endlosschleife. Siehe this for the subtle differences between Close and Dispose.

Verwandte Themen