Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Remplir des textbox avec un tableau

Pour un sudoku...

Sujet résolu
    21 avril 2011 à 22:47:39

    Bonjour à tous !

    Pour faire une grille du sudoku, j'ai créé 81 textbox.
    Je comptai faire un tableau d'entiers à deux dimension de [9, 9] et remplir 1 textbox pour 1 case du tableau.
    Le hic, c'est que je ne sais pas parcourir les textbox comme je parcours un tableau :euh:
    J'aimerai remplir la textbox 1 par la valeur 1, la textbox 2 par le valeur 2...

    Merci de m'apporter vos idées et propositions ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
      21 avril 2011 à 23:15:34

      Bon, plutôt que d'arriver à faire cela à bras, je te conseille plutôt d'implémenter ces TextBox par programmation à l'aide de boucles imbriquées.

      Il est possible de faire des tableaux à deux dimensions, ce qui représente ta grille. Vois cette structure comme une grille en deux dimensions (x,y), c'est plus simple. Sinon, tu peux toujours les voir comme un tableau dans chaque grille d'un tableau, mais c'est plus compliqué au niveau de l'esprit comme idée.

      Textbox[,] champs = new Textbox[9,9];
      
      //Ici, la méthode GetLength(int x) prend en paramètre la dimension.
      for(int i = 0; i < champs.GetLength(0); i++)
      {
         for(int j = o; j < champs.GetLength(1) ; j++)
         {
            champs[i,j] = new Textbox(/*Paramètres ici*/);
            //Instructions additionnelles ici.
         }
      }
      


      Et voilà un tableau de Textbox. Il n'y a pas que des types simples qui peuvent être des tableaux ;) .

      En espérant avoir répondu à tes questions,
      gretro
      • Partager sur Facebook
      • Partager sur Twitter
        22 avril 2011 à 0:15:27

        Hum... :o

        Je comprends que le code que tu propose fais un truc du genre "Pour chaque lignes de chaque colonnes de "champs",
        faire
        champs[i,j] = new Textbox(/*Paramètres ici*/);
        


        -Pourrai tu préciser cette ligne?

        -Quel genre de paramètre pourrai il y avoir à la place de /*Paramètres ici*/ ?

        -Comment initialiser un tableau de textbox?

        Merci de t’intéresser à mon problème :)
        Eolt
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          22 avril 2011 à 5:03:10

          J'avait fait un démineur il y a quelques semaines et pour crée mes button je fesait ceci

          M et N = dimension.
          For i As Integer = 0 To m - 1 ' m
                      For j As Integer = 0 To n - 1 ' n
                          Dim Tmp As Button = New Button()
                          With Tmp
                          Tmp.Name = "ButtonNb" & i & "/" & j
                          Tmp.Left = 40 + (j * 20)
                          Tmp.Top = 40 + (i * 20)
                          Tmp.Size = New System.Drawing.Size(20, 
                          End With
                          AddHandler Tmp.MouseUp, AddressOf HandleEvent // HandleEvent = function
          
                          Controls.Add(Tmp) // pour ajouter à la fenetre
                          
                          texteBoxes.Add(Tmp.Name, Tmp) // Ceci étant déclarer plus haut comme Dim texteBoxes As Hashtable = New Hashtable()
                      Next
                  Next
          


          Espérant que sa puisse t'aider
          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2011 à 20:42:36

            La theorie en arriere de ce bout de code est tres simple. Lorsque, comme dans ton cas, il faut faire appel a une grille, les noms des champs deviennent inutiles. En effet, appeler les champs par leur nom ne fait qu'alourdir le code. Dans ces cas-la, on prefera les appeler par index, ce qu'un tableau te permet.

            Je commence a la base, car je ne connais pas ton "background". Lorsque ton met un champs TextBox sur le formulaire avec l'editeur de Visual Studio, celui-ci genere en fait ton code. Tu peux voir ce qu'il genere en allant dans la fichier [NOMDELAFORM].Designer.cs. Seulement, creer 81 Textbox, c'est long est pas franchement optimise comme code. Heureusement, les boucles peuvent nous sauver la mise.

            //On va d'abord definir certaines constantes
            
            //Ces constantes definissent la hauteur et la largeur des TextBox (en px)
            private const int LARGEUR_TXT = 30;
            private const int HAUTEUR_TXT = 30;
            
            //Ces constantes definissent l'espacement entre les TextBox (en px)
            private const int OFFSET_LARGEUR = 2;
            private const int OFFSET_HAUTEUR = 2;
            
            //Ces constantes definissent la position de depart (en px).
            private const int START_POSITION_X = 10;
            private const int START_POSITION_Y = 10;
            
            //Methode qui sera appelee a la creation de la Form
            private void CreerChamps(Textbox[,] textboxes)
            {
               //On cree une boucle qui fera le tour de toutes les colonnes de la 1ere dimension
               for(int i = 0; i < textboxes.GetLength(0); i++)
               {
                  //On cree une boucle qui fera le tour de la 2e dimension
                  for(int j = 0; j < textboxes.GetLength(1); j++)
                  {
                      //Pour chaque 'case' rencontree, on cree un TextBox
                      textboxes[i,j] = new Textbox();
                      
                      //On initialise ses proprietes specifiques ici.
                      //  Ex : taille, position, texte, etc, etc.
                      //Pour cette section, je te refere a MSDN (la documentation).
                  }
               }
            }
            


            Et voila, c'est simple comme cela. Je n'ai pas resolu le probleme en entier, car il te faut te creuser un peu la tete pour bien comprendre, mais tu devrais bien comprendre ;-).

            Oh, et pour la documentation de MSDN, va a cette adresse ci.

            Voila !
            J'espere t'avoir ete utile, au moins un peu ;-)

            PS : Ne met pas ce code dans la page Designer. Visual Studio la reconstruit souvent, et pourrait bien finir par detruire ton code. N'oublie pas d'appeler ta fonction a la construction de ta Form, juste apres InitializeComponents();

            PPS : Haha, désolé, j'avais oublié ta question sur comment initialiser un tableau à plusieurs dimensions. Très franchement, c'est pareil qu'initialiser un tableau à 1 dimension.

            //Dans le type, il est important de spécifier le nombre de dimension à l'aide d'une virgule.
            //Le x et le y sont des variables qui déterminent la longueur et la largeur du tableau.
            //N'oublie pas de voir cette structure comme une grille. Sinon, ça peut vite devenir mélangeant !
            Textbox[,] nomDuTableau = new Textbox[x,y];
            
            • Partager sur Facebook
            • Partager sur Twitter
              25 avril 2011 à 21:34:02

              Je vais me pencher sur ton post mais à première vu je pense que c'est pile poil ce que je voulais savoir, je cherchais à acceder aux textbox faites avec le designer de Visual Studio et le code généré automatiquement ne m'aidait pas vraiment... ;)
              Je voyais bien que ce n'était pas la meilleure solution, pour un sudoku encore... mais le jour ou j'aurai affaire à 1000 textbox (sait on jamais ?!)

              Ma question était de savoir comment initialiser un tableau à deux dimension de textbox.
              J'avais un problème du genre "impossible de convertir implicitement un int ou un string en textbox"...
              Mais je m'y prenais mal :-°

              Je te tiens au courant de l'avancée des choses.

              Merci :)
              • Partager sur Facebook
              • Partager sur Twitter
                25 avril 2011 à 21:42:53

                Salut,

                Ton problème viens probablement du fait que tu fait un textboxes[0,0] = "1", or tu doit plutot faire un textboxes[0,0].Text = "1" ;)

                Si c'est pas ça, explique plus clairement ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  26 avril 2011 à 19:45:11

                  Je viens d'essayer comme gretro propose, et ça fonctionne! :p
                  Reste encore que mes textbox sont toutes espacées de la même façon avec

                  textboxes[i, j].Location = new Point((MARGE + START_POSITION_X * OFFSET_LARGEUR * i),
                                                       (MARGE + START_POSITION_Y * OFFSET_HAUTEUR * j));
                  


                  Pour faire les groupements par 9 blocs de 3*3 je pense que je vais y arriver sans trop de soucis avec un "for" en plus... ^^

                  Pour l'histoire des textbox.text rien d'important, juste une erreur bête de ma part o_O

                  Merci beaucoup pour l'aide apportée!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 avril 2011 à 20:52:51

                    Content d'avoir pu t'aider !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [C#] Remplir des textbox avec un tableau

                    × 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