Partage
  • Partager sur Facebook
  • Partager sur Twitter

Donner le Focus à un Unsercontrol

Sujet résolu
    20 septembre 2018 à 8:28:28

    Bonjour à tous !

    Cela fait 2 jous que je me prends la tête pour quelque chose qui parrait tellement simple mais qui en réalité pour moi savère une grosse galère.

    J'ai une Form1 qui contient un Flowlayoutpanel1 dans le quelle se duplique un Usercontrol qui contient une Checkbox, une Textbox et un bouton Delete.

    "La Checkbox sert à afficher le bouton Delete"

    A chaque fois que l'on scanne une référence dans la textbox automatiquement le Usercontrol se duplique en dessous et ainsi de suite.

    Le problème arrive maintenant ! :)

    Imaginons que je viens de scanner "x" référence et que tout d'un coup je me trompe et que je dois supprimer une ligne.

    Je clique sur ma Checkbox de la ligne a supprimer et ensuite je clique sur le bouton Delete.

    Mais maintenant mon Focus n'est plus sur la Textbox de mon dernier Usercontrol tout en dessous.

    Même si je met Textbox1.select sur mon bouton Delete cela ne fonctionnera jamais vu qu'il va vouloir pointer la Textbox1 du control même que je supprime.

    J'ai déjà tenté de faire une commande pour récupérer qui avait en dernier le Focus mais cela n'a pas fonctionné non plus.

    Si quelqu'un aurait une solution à me présenter ou une piste pour que je puisse corriger se problème je serai vraiment très Heureux !

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2018 à 11:51:11

      Heu, pourquoi ne pas sauvegarder dans un champ du formulaire la dernière TextBox ayant eu le focus ?

      Votre formulaire s'enregistre sur un évènement de votre UserControl qui se déclenche quand sa TextBox obtient le focus.

      Lors du déclenchement de cet évènement, le formulaire sauvegarde la source de l’évènement.

      Vous pouvez utiliser une liste LIFO pour gérer l'historique du focus, car le précédent contrôle peut déjà avoir été "caché" et donc il faut l'historique inverse pour prendre l'avant-dernier, et ainsi de suite.

      Votre formulaire s'enregistre aussi sur la "destruction" de votre UserControl et utilise la sauvegarde pour gérer le focus.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        20 septembre 2018 à 15:08:28

        Bonjour Bacelar,

        Merci pour ta réponse je vais étudier cette possibilité que je n'ai encore jamais pratiqué.

        Cependant, à la base je pensais me baser sur Textbox1.Enabled pour la retrouver dans mon flowlayoutpanel.

        Vu que à chaque fois que la référence est scanné la textbox1 passe en Textbox1.enabled = false

        Donc même si dans mon flowlayoutpanel j'ai 150 Usercontrol identique, il y en aura toujours que 1 ou la Textbox1.enabled = true

        Et c'est celle-ci qui doit recevoir le focus.

        Mais je ne trouve rien sur internet par rapport à ça.

        Est-ce que pour toi ça serait faisaible ? C'est peut-être même moins compliqué ?

        Merci d'avance pour ton retour.

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2018 à 18:57:16

          Vous mélangez un peu tout.

          "Enabled", ça ne donne pas le focus, à la rigueur, ça redonne au contrôle d'avoir de nouveau le focus, si on clique dessus.

          >la référence est scanné la textbox1 passe en Textbox1.enabled = false

          Ok, vous n'avez qu'une textBox "enabled" à la fois et c'est toujours la dernière ajoutée au "flowlayoutpanel" ?

          Si c'est le cas, vous pouvez vous en sortir avec la propriété Contols de votre "flowlayoutpanel" :

          https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.flowlayoutpanel?view=netframework-4.7.2#propri%C3%A9t%C3%A9s

          Comme vous ajoutez dynamiquement des contrôles à ce panel, le dernier de la liste Contols de "flowlayoutpanel" contiendra le dernier contrôle ajouté à votre Panel.

          Une fois le contrôle trouvé, il faut appeler Select dessus :

          https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.control.select?view=netframework-4.7.2#System_Windows_Forms_Control_Select

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            21 septembre 2018 à 7:25:30

            Oui effectivement je sais pas bien que enabled ne donne pas le focus.

            Mais oui je n'ai bien que une textbox avec l'option enabled = True et il s'agit bien de toujours la dernière ajouter à mon flowlayout panel et c'est bien celle-la qui doit recevoir le focus.

            Cependant mon idée ne fonctionne pas d'après mon code ci-dessous :

              Dim ctrls() As Control = Form1.FlowLayoutPanel1.Controls.Find("usercontrol1", False)
                 
                    For Each c As Control In ctrls
                        c.Select()
                    Next
                    
                    If (ctrls.Length > 0) Then
                        ctrls(0).Select()
                    End If

            Je sais bien que tout mes controls nomme Usercontrol1 mais normalement si plusieurs controls sont trouvés il devrait selectionner le dernier hors que la il reste toujours sur le tout premier de la liste.



            -
            Edité par GregoryMeganck 21 septembre 2018 à 7:52:02

            • Partager sur Facebook
            • Partager sur Twitter
              21 septembre 2018 à 10:07:25

              Ctrls(0) c'est le 1er élément du tableau du coup faut pas s'étonner qu'il soit sélectionné
              • Partager sur Facebook
              • Partager sur Twitter
              Censément, quelqu'un de sensé est censé s'exprimer sensément.
                21 septembre 2018 à 13:25:09

                Oui effectivement sur la commande la j'ai mis 0 mais peut importe le nombre indiqué il reste toujours sur le 1er Usercontrol en haut du flowlayoutpanel.

                Voici mon code actuel :

                  Dim count As Integer = CountVisibleChildControls(Of UserControl1)(Form1.FlowLayoutPanel1)
                        Dim ctrls() As Control = Form1.FlowLayoutPanel1.Controls.Find("usercontrol1", False)
                
                        For Each c As Control In ctrls
                            c.Select()
                        Next
                
                        If (ctrls.Length > 0) Then
                            ctrls(count.ToString).Select()
                        End If
                
                    End Sub


                Merci pour votre aide !

                • Partager sur Facebook
                • Partager sur Twitter
                  21 septembre 2018 à 14:17:29

                  Pourquoi faire un "Find" s'il n'a que des UserControl1 ???

                  Je ne suis pas sûr que "Find" doive conserver l'ordre de la liste de départ.

                  Ligne 9, par défaut, les indices commence à 0, pas à 1, et on utilise dans int, pas des string.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    24 septembre 2018 à 16:08:32

                    Re Bacelar !

                    Comme promis me voilà !

                    Donc finalement j'ai réussi à résoudre mon problème comme ceci :

                    J'ai constaté que quand mon focus est situé sur un bouton situé sur ma Form1 et que je faisais un " SHIFT TAB "automatiquement le focus repartait sur le dernier control de mon flowlayoutpanel 
                    Donc voilà maintenant quand je clique sur le bouton Delete, je demande de positionner le focus sur le Bouton de ma form1 et j'envoi un SendKeys avec SHIFT TAB et le tour est joué !
                    En tout cas merci quand même pour votre aide !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 septembre 2018 à 17:00:31

                      Comme dit sur DVP: https://www.developpez.net/forums/d1895891/c-cpp/outils-c-cpp/visual-cpp/vcpp-net/donner-focus-usercontrol-duplique/

                      BOF

                      <copie>

                      OK.

                      Merci pour votre retour et votre solution.

                      Je la trouve un peu trop bricolage pour moi.

                      Si vous ajoutez un contrôle qui change la "séquence Tab" de votre formulaire, CABOOM !
                      Si une entrée clavier arrive entre ces bidouilles, CABOOM !
                      etc...

                      Je ne comprends pas pourquoi faire une approche aussi complexe quand le controle à activer doit juste être le dernier de la liste "Controls" de votre "FlowLayoutPanel1".

                      Si vous pouvez poster le code de la form et de l'user-controle pour vérifier pourquoi la solution "évidente" ne fonctionne pas, ça serait pas mal.

                      </copie>

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                      Donner le Focus à un Unsercontrol

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown