Exploitation d'une TextBox créée par code.

1ModdingMaster - 28 mai 2013 à 18:38
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 31 mai 2013 à 23:20
Bonjour à toutes et à tous, réalisant actuellement un logiciel de gestion personnel, je sollicite votre aide dans la mesure où je suis bloqué quelque part dans mon code et malgré mon sens de la réflexion je ne suis pas en mesure de résoudre ce problème.

Mon problème est le suivant : J'ai créé un formulaire graphique avec les outils de Visual Studio, et j'ai à un moment placé un bouton (Button9) qui à pour but d'agrandir ce formulaire sur le côté droit, ainsi que d'ajouter des éléments virtuels par le biais de codes (new List), j'ai ensuite déclaré des événements afin de rendre ces éléments réactifs, et du coup, ces éléments ne peuvent pas être exploités comme par exemple un bouton (Button11) que j'ai créé et soumis à un événement (Button11_Click). Regardez l'image pour voir où je me situe :



Voilà, si vous avez besoin de plus de renseignements je vous en fournirait. Merci d'avance à ceux qui me répondront. A bientôt.

13 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
28 mai 2013 à 19:49
Bonsoir,

mettre le code en image n'est pas très pratique, la prochaine fois utilise les balises de coloration syntaxique (3ième icône en partant de la droite : ) .

Cela me semble normal que le compilateur te refuse TextBox1, car elle n'existe pas pour lui.
Je pense qu'il faut que tu te la trouve autrement.

Un truc comme ça
            TextBox maBox;

            foreach (Control c in this.Controls)
            {
                if (c.Name "TextBox1") maBox (TextBox)c;
            }



Whismeril
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mai 2013 à 20:50
Salut,

Si tu veux continuer à stocker tes controles dans un conteneur,
à la place de faire une List<TextBox>,
tu pourrais faire un HashTable("clef", object)

// Membre de la classe
private HashTable _mesTextBox = new HashTable();

// Crée un TextBox nommé 
TextBox TB1 = new TextBox(); // l'objet
TB1.Name = "TB1"; // la clef

// Ajoute au dictionnaire
_mesTextBox.Add(TB1.Name, TB1);

// Utilise n'importe ou dans la classe
if( (_mesTextBox["TB1"] as TextBox).Text == "CLOSE" )
{

}


bye...
0
1ModdingMaster
29 mai 2013 à 18:01
Bonjour, merci de vos réponses, j'applique vos techniques tout de suite, je vous tiens informé du bon fonctionnement. Merci.
0
1ModdingMaster
29 mai 2013 à 18:20
Je viens d'appliquer la solution de yann_lo_san, cependant cela génère une multitude d'erreurs. Ce procédé consiste à déclarer un HashTable Privé, et malheureusement la déclaration refuse d'être prise en compte dans un private void button déjà existant et en plus dans une condition.

En fait c'est à l'action d'un bouton que je dois obtenir cette génération d'éléments.

Merci de votre aide tout de même.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
29 mai 2013 à 18:40
Il faut que ta table de Hash soit accessible sur tout ton formulaire, il te faut donc la déclarer avec un rayon d'action le plus grand possible


Whismeril
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
29 mai 2013 à 21:49
Re,

OK, je te détaille un peu plus :

// Une classe
public class monFormulaire : Form
{
    // déclaration des variables MEMBRES
    private HashTable _mesTextBox;
    private HashTable _mesBoutons;

    // 1 construteur
    public void monFormulaire()
    {
        // InitializeComponent();

        _mesTextBox = new HashTable();
        _mesBoutons = new HashTable();
        CreeLesControlesDynamiques();
    }
 
    // fonction utilisateur pour créer tous les controles
    private void CreeLesControlesDynamiques()
    {
        // Les textBox
        TextBox TB1 = new TextBox(); 
        TB1.Name = "TB1";
        TB1.Location = new Point(1,1); // ect... 
        _mesTextBox.Add(TB1.Name, TB1);
        // autres textbox ici

        // Les boutons
        Button BT1 = new Button(); 
        BT1.Name = "BT1";
        BT1.Click += new EventHandler(this.btn_click);
        _mesBoutons.Add(BT1.Name, BT1);
        // autres btn ici

        // 2eme btn utilise le même click
        Button BT2 = new Button(); 
        BT2.Name = "BT2";
        BT2.Click += new EventHandler(this.btn_click);
        _mesBoutons.Add(BT2.Name, BT2);
    }

    // Les events    
    private void btn_click(object sender, EventArgs e)
    {
        // ici les variables membres sont accessibles

        // quel est le bouton cliqué, le BT1 ?
        if( "BT1" == (sender as Control).Name )
        {
            if( (_mesTextBox["TB1"] as TextBox).Text == "CLOSE" )
            {

            }
        }
        // Action pour le click sur bouton 2
        else if( "BT2" == (sender as Control).Name )
        {
            // ect...
        } 
    }
}


En l'écrivant, je m'aperçois que ce n'est vraiment pas la meilleure solution (beaucoup trop de cast), mais bon, si tu peux voir que ça marche, ça te donnera des idées pour faire mieux.

bye...
0
1ModdingMaster
29 mai 2013 à 22:48
D'accord je comprend un peu mieux, j'aimerai mettre en œuvre cette solution par contre quand je déclare un HashTable (peu importe où je le met) il me dit que l'espace de nom est introuvable, est-ce normal ? Faut-il utiliser une classe mère particulière ? Pour ma part j'ai essayé System.Collections.Hashtable; mais sans succès, j'ai toujours les mots soulignés en rouge (ou en bleu après compilation).

Merci de vos réponse.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
29 mai 2013 à 22:58
Fais un click droit sur le mot hashtable, choisit résoudre. Ça va te proposer le usine qui va bien.

Whismeril
0
1ModdingMaster
30 mai 2013 à 13:05
Ah oui merci beaucoup, je ne connaissais pas cette technique.
0
1ModdingMaster
31 mai 2013 à 14:25
Bonjour, bon du coup j'ai trouvé une autre technique beaucoup plus simple, le mieux c'est de créer les éléments souhaités, mais de les afficher à un moment souhaité, en gros :

1) Création d'un grand formulaire (ex : 1024x512),
2) Ajouts des éléments (ex : Label, TextBox, Button),
3) Ajouter un ClientSize(ex : 512x512) au lancement du formulaire,
4) Ajouter un bouton qui aura pour but de modifier de nouveau le ClientSize(1024x512).

Ça évite de faire des génération d'éléments. Merci de vos aides tout de même, ça m'a fait réfléchir sur cette trouvaille.

Par contre j'ai juste une autre question (je ne vais pas créer un nouveau sujet pour cela, ça a un rapport avec les TextBox), c'est : Comment bloquer un caractère dans une TextBox de façon à ce que démarrage du formulaire on ne puisse pas effacer ce caractère ? En fait un peu comme un invite de commande, on ne peut pas supprimer le "C:\>".

J'ai d'abord pensé à un changement de position de curseur, peut-être que c'est cela mais je n'arrive pas à le mettre en place.

Merci d'avance pour la réponse,

A bientôt.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2013 à 15:30
Bonjour

pour placer le curseur ou tu veux, le code suivant doit être appelé par les événements Enter et Clcik de ton Texbox
            textBox1.SelectionStart = 3;
            textBox1.SelectionLength = 0;


Si tu veux forcer un chemin sur c:, tu peux utiliser un maskedTextBox:
            maskedTextBox1.Mask = @"c:\CCCCCC";//ne peux acceptre que c:\ et 6 caractères facultatifs
            maskedTextBox1.Text = @"c:";

Voir ici pour plus de détails.

Si ça ne te convient pas (par exemple limiter un chemin à 6 caractères c'est pas pratique), tu peux essayer une REGEX dans l'evenement changed d'un textbox.

Enfin, à la fin de cette discussion, il y a le code pour taiter le message du clavier est en faire ce que tu veux

Whismeril
0
1ModdingMaster
31 mai 2013 à 21:36
Excuse-moi mais je n'ai pas très bien compris ta méthode. J'ai bien créé les événements suivants du TextBox, le Enter et le Click, et j'ai bien mis le code suivant que tu m'a fourni pour donner ceci:

        private void TextBox1_Enter(object sender, EventArgs e)
        {
            TextBox1.SelectionStart = 3;
            TextBox1.SelectionLength = 0;
        }

        private void TextBox1_Click(object sender, EventArgs e)
        {
            TextBox1.SelectionStart = 3;
            TextBox1.SelectionLength = 0;
        }


Mais ça ne marche toujours pas, je peux toujours effacer le premier caractère (>), sais-tu pourquoi ? Ai-je mal compris ta réponse ?

Merci,

A bientôt...
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2013 à 23:20
Ce code ne sert qu'à placer le curseur à une position définie dans le texte prééexistant (j'ai mis 3 pour l'exemple).
Ça n'empêchera pas d'appuyer sur "supr".

La suite du message sert à ça:
solution 1 maskedtextbox
solution 2 Regex dans l'événement TextChanged
solution 3 héritage et traitement du message clavier


Whismeril
0
Rejoignez-nous