J'essaie de rendre mon application VB.NET un peu meilleure à utiliser en rendant certaines des formes sans modèle.
Je pense avoir compris comment utiliser dlg.Show () et dlg.Hide () au lieu d'appeler dlg.ShowDialog (). J'ai une instance de ma boîte de dialogue non modale dans mon formulaire de candidature principal:
Public theModelessDialog As New dlgModeless
Pour lancer le dialogue sans modèle que j'appelle
theModelessDialog.Show()
et dans les gestionnaires de boutons OK et Annuler dans dlgModeless
j'ai
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
et cela semble bien fonctionner.
Le bouton "X" en haut à droite me prend, cependant. Lorsque je ferme le formulaire avec ce bouton, puis que je tente de rouvrir le formulaire, je reçois
ObjectDisposedException n'a pas été gérée. Impossible d'accéder à un objet supprimé.
Je sens que je suis presque tout le chemin, mais je ne peux pas trouver comment faire l'une ou l'autre des choses suivantes:
Des idées?
La classe de cette boîte de dialogue est System.Windows.Forms.Form
.
Utilisez Me.Close()
pour masquer le formulaire. Pour l'ouvrir, utilisez l'extrait suivant:
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
S'il s'agit de sauvegarder des données, vous devrez trouver un moyen de les stocker (peut-être dans une variable statique dans le formulaire). C’est la bonne façon de faire ce que vous essayez d’atteindre.
Vous devrez également me pardonner si mon VB est éteint, cela fait longtemps.
Attrapez l'événement FormClosing et, si le motif est UserClosing, définissez Cancel sur l'événement sur true.
Quelque chose comme ce qui suit:
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
l'événement formclosing me permet de faire une sortie gérée du formulaire. J'ai donc inclus une question à confirmer pour quitter. J'ai aussi un indicateur de forme bterminate pour forcer l'annulation où je le veux et donc ne pas poser la question. Merci votre suggestion m'a aidé aussi :)
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 Cachait le formulaire dans son code et les réponses ci-dessus apportaient une solution à ce problème. Souvent, cependant, vous n’avez pas l’intention de réutiliser le formulaire, vous avez donc faire veux que le formulaire soit éliminé. Toutes les activités liées à Close seront réunies au même endroit si vous gérez l'événement FormClosing à l'aide de Me.FormClosing
en l'ajoutant au code Annulation/Fermeture/Sortie que vous avez déjà. par exemple. dans le cas 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
Notez l'utilisation du Me.Dispose
au lieu de tout Me.Close
existant. Si vous quittez le Me.Close
, vous créerez une boucle infinie. Voir this pour les différences subtiles entre Close et Dispose .
J'ai tout essayé et cela n'a pas fonctionné Si vous voulez juste fermer sans afficher de boîte de message, vous aurez juste besoin de:
Private Sub FORM1_FormClosing (expéditeur en tant qu'objet, et en tant que FormClosingEventArgs) gère Me.FormClosing
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
End Sub
J'espère que cela vous aide ...!
D'accord avec la gestion de l'événement FormClosing. Ou modifiez les propriétés du formulaire pour masquer le contrôle X du système.