-2
votes

Fermez tous les formulaires ouverts à l'exception de certains VB.Net

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.


8 commentaires

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") et lista = 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 :) :)


3 Réponses :


1
votes

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


3 commentaires

Ç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.



2
votes

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


4 commentaires

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.



0
votes

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


0 commentaires