comme titre, j'essaye de fermer tous les formulaires ouverts sauf certains dans VB.Net mais les formulaires ne se ferment pas. Voici le code que j'ai utilisé:
Dim lista As New FormCollection lista = Application.OpenForms For Each a As Form In lista If Not a.Text = "formLogout" And a.Text = "arresto" And a.Text = "riavvio" And a.Text = "formOpen" Then a.Close() End If Next scrivania.Close() Me.Close()
Grazie.
3 Réponses :
If
instruction If
retournera true lorsque toutes les conditions fournies sont vraies , ce qui n'est pas possible car vous comparez le même form.Text
avec des valeurs différentes.
Notez que dans votre exemple Not
sera appliqué uniquement pour la première condition
Vous pouvez éventuellement réécrire la condition comme suit:
Dim remainOpenForms As New HashSet(Of String) remainOpenForms.Add("formLogout") remainOpenForms.Add("arresto") ' Create collection of forms to be closed Dim formsToClose As New List(Of Form) For Each form As Form In Application.OpenForms If remainOpenForms.Contains(form.Text) = False Then formsToClose.Add(form) Next For Each form As Form In formsToClose form.Close() Next
Suggérer d'utiliser une collection de noms de formulaires, qui ne doivent pas être fermés
If Not (form.Text = "formLogout" OrElse form.Text = "arresto") Then ..
Ça ne marche pas. Cela m'a également donné une exception car la collection de formulaires a été modifiée. @Fabio
@HelloXD, true, vous ne pouvez pas fermer les formulaires pendant l'itération d' ApplicationOpenForms
, car le formulaire en sera supprimé une fois fermé. Vérifiez la réponse mise à jour.
@Fabio Merci pour votre introduction à HashSet. Il a des méthodes très intéressantes.
Identique à la réponse de @Fabio sans la collection et la boucle supplémentaires.
Dim keepOpen As New List(Of String) From {Me.Text, Form2.Text, Form3.Text} For index = Application.OpenForms.Count - 1 To 0 Step -1 If Not keepOpen.Contains(Application.OpenForms(index).Text) Then Application.OpenForms(index).Close() End If Next
Ou vous pouvez utiliser For Each form As Form in Application.OpenForms.Reverse()
@Fabio Avoir un gribouillage rouge sous Application.OpenForms.Reverse (). Bien qu'il doive implémenter IEnumerable, il s'agit d'une propriété en lecture seule. Cela voudrait-il dire qu'il ne peut pas utiliser .Reverse?
For Each form As Form In Application.OpenForms.OfType(Of Form).Reverse()
extensions Linq sont appliquées à des types de collections spécifiques. OfType()
renvoie un IEnumerable
, ce n'est pas le cas d' OpenForms
.
@Jimi compris. Merci.
Je sais que c'est trop tard mais pour certains voici ma réponse
ce que cela fait est de fermer tous les formulaires sauf "exceptthisform"
Dim formNames As New List(Of String) For Each currentForm As Form In Application.OpenForms If currentForm.Name <> "exceptthisform" Then formNames.Add(currentForm.Name) End If Next For Each currentFormName As String In formNames Application.OpenForms(currentFormName).Close() Next
Votre expression est analysée comme
If (Not (a.Text = "formLogout")) And (a.Text = "arresto") And (a.Text = "riavvio") And (a.Text = "formOpen") Then
which est toujours faux.@GSerg: Merci d'avoir souligné l'importance de l'associativité dans les expressions booléennes. À mon avis, l'utilisation des parenthèses devrait être obligatoire .
@GSerg J'ai essayé avec des parenthèses mais cela ne fonctionne pas.
@HelloXD Je ne vous ai pas dit d'essayer avec des parenthèses. J'ai montré (à l'aide de parenthèses) comment votre expression est actuellement analysée.
Dire
Dim lista As New FormCollection
sur une ligne (accent sur le "Nouveau") etlista = somethingelse
sur la suivante démontre un malentendu fondamental sur la façon dont le langage gère les références d'objet par rapport aux instances d'objet.@JoelCoehoorn, étrange - ce symptôme est très très courant pour les développeurs vb.net, mais je ne m'en souviens pas en c #;)
@Fabio Honnêtement, à ce stade, ils doivent créer et documenter (pour que vous puissiez compter dessus) une optimisation du compilateur pour ce scénario, de sorte que l'allocation supplémentaire n'a jamais lieu. Je serai surpris si le premier ne se produit pas (du moins) au moment du JIT de toute façon, mais cela pourrait aussi être garanti.
@JoelCoehoorn - donc plus de discussions lors des révisions de code :) :)