WPF Textbox et Bouton

Résolu/Fermé
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021 - Modifié le 28 avril 2020 à 14:36
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021 - 29 avril 2020 à 10:38
Bonjour à tous, ✌

Mon objectif est d'avoir une application WPF contenant plusieurs textbox et deux bouton(New et Test).
Actuellement quand je clique sur New, le curseur se met automatiquement dans la première TextBox. Quand je clique sur la touche "Entrée " le curseur va automatiquement sur le prochain TxtBox:
if (e.Key == System.Windows.Input.Key.Enter)
            {
                TextBox textBox = sender as TextBox; //on caste sender en textbox
                if (textBox == null)//si en fait sender n'était pas une textbox on sort
                    return;

                List<TextBox> textBoxes = Grid.Children.OfType<TextBox>().ToList();//la liste de tous les textbox actuels

                int index = textBoxes.IndexOf(textBox);//index du textbox en cours dans la liste

                if (++index == textBoxes.Count)//si en ajoutant 1, on atteint un index trop grand, on remet à zéro
                    index = 0;

                textBoxes[index].Focus();
            }


CC @Whismeril


Je souhaiterais en cliquant sur le bouton test, qu'un texte "test" s'affiche dans la Txtbox actuellement sélectionné et quant je clique sur "Entrée" , il faut que ça continu à passer à la TxtBox suivante.
Je ne sais pas si j'ai été très clair, si quelqu'un a une idée *Emoji pensif*

Merci d'avance

4 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
28 avril 2020 à 15:04
Bonjour

Est ce que le nombre de textbox est fixe, ou sont-elles ajoutées dynamiquement?
0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
28 avril 2020 à 19:35
Oui le nombre est fixe mais je voudrais éviter de faire un if avec chaque TxtBox
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
28 avril 2020 à 19:40
Ok

alors on va modifié le code que je t'ai donné hier.

Cependant, ce que je vais te montrer là va à l'encontre de la liaison de données (Binding) qui est l'un des gros points forts de WPF.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
28 avril 2020 à 20:03
On ne peut pas utiliser la propriété Focused, car en cliquant sur le bouton, c'est lui qui a le focus.
Je me sers donc de l'index, que je mémorise


        List<TextBox> textBoxes;//la liste devient "globale" à la classe pour ne pas refaire n fois la même requête, et servir aux 2 interactions
        int indexTextBox;//idem pour l'index

        public MainWindow()
        {
            InitializeComponent();

            textBoxes = leGrid.Children.OfType<TextBox>().OrderBy(t => Convert.ToInt32(t.Tag)).ToList();
        }

        private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if(e.Key == System.Windows.Input.Key.Enter)
            {
                SetIndex(sender);

                if (++indexTextBox == textBoxes.Count)//si een ajoutant 1, on atteint un index trop grand, on remet à zéro
                    indexTextBox = 0;

                textBoxes[indexTextBox].Focus();
            }
        }

        private void SetIndex(object sender)
        {
            TextBox textBox = sender as TextBox; //on caste sender en textbox
            if (textBox == null)//si en fait sender n'était pas une textbox on sort
                return;

            indexTextBox = textBoxes.IndexOf(textBox);//index du textbox en cours dans la liste
        }

        private void TextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            SetIndex(sender);//au cas ou le focus soit parvenu autrement (souris ou Tab par exemple)
        }

        private void ButTest_Click(object sender, RoutedEventArgs e)
        {
            textBoxes[indexTextBox].Text = "Coucou";
        }


    <Grid x:Name="leGrid">
        <TextBox HorizontalAlignment="Left" Height="23" Margin="445,69,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" KeyDown="TextBox_KeyDown" Tag="1" GotFocus="TextBox_GotFocus"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="445,125,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" KeyDown="TextBox_KeyDown" Tag="3" GotFocus="TextBox_GotFocus"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="445,153,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" KeyDown="TextBox_KeyDown" Tag="4" GotFocus="TextBox_GotFocus"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="445,97,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" KeyDown="TextBox_KeyDown" Tag="2" GotFocus="TextBox_GotFocus"/>
        <Button Content="Test" HorizontalAlignment="Left" Margin="471,208,0,0" VerticalAlignment="Top" Width="75" Click="ButTest_Click"/>

0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
29 avril 2020 à 09:46
Je viens d'essayer, ça fonctionne vraiment bien.
Cependant quand je clique sur le bouton "test" le curseur ne passe pas à la prochaine textbox.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
29 avril 2020 à 10:00
Ha oui, alors après avoir écrit le text il faut que tu donnes le focus à la textbox
0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
29 avril 2020 à 10:38
C'est bon, tout fonctionne ! Merci beaucoup
0