TextBox en Label [Résolu]

BarthOlivier 133 Messages postés mercredi 6 mars 2002Date d'inscription 27 novembre 2012 Dernière intervention - 8 nov. 2012 à 17:32 - Dernière réponse : BarthOlivier 133 Messages postés mercredi 6 mars 2002Date d'inscription 27 novembre 2012 Dernière intervention
- 14 nov. 2012 à 10:53
Bonjour,

Je viens de regarder sur les forums (peut-être mal) et je n'arrive pas à trouver de solution à mon problème.
Je tourne en rond depuis 4H et ça me semble infaisable. Un peu de fainéantise ? <maybe>

Dans l'une de mes applications, je dois remplacer tous les contrôles TextBox par des contrôles Labels.
Ca semble fonctionner en apparence. Mais impossible de modifier le text de ces "nouveau contrôles" depuis
des fonctions initialement compilées pour écrire dans les TextBox ...

voici ma fonction de remplacement :

        private void SetTypeSaisie(bool Tablette)
        {
            int X = 0;
            if (Tablette)
            {
                IEnumerable<Control> ListControl = gData.ControlsAvecRecursivite(this);
                foreach (Control ctrl in ListControl)
                {
                    if (ctrl.BackColor SystemColors.Window) ctrl.BackColor Color.White;

                    if (ctrl is TextBox)
                    {
                        Label NewCtr = new Label();
                        Control Parent = ctrl.Parent;
                        IntPtr ctrlHandle = ctrl.Handle;

                        string strName = ctrl.Name;
                        if (!string.IsNullOrEmpty(strName))
                        {
                            ctrl.Name = strName + "_" + X++;
                            NewCtr.Name = strName;
                            NewCtr.AutoSize = false;
                            NewCtr.Size = ctrl.Size;
                            NewCtr.Left = ctrl.Left;
                            NewCtr.Top = ctrl.Top;
                            NewCtr.Text = ctrl.Text;
                            NewCtr.BackColor = ctrl.BackColor;
                            NewCtr.BorderStyle = BorderStyle.Fixed3D;

                            NewCtr.Font = ctrl.Font;
                            NewCtr.ForeColor = ctrl.ForeColor;
                            if ((ctrl as TextBox).TextAlign == HorizontalAlignment.Center)
                                NewCtr.TextAlign = ContentAlignment.MiddleCenter;
                            else if ((ctrl as TextBox).TextAlign == HorizontalAlignment.Left)
                                NewCtr.TextAlign = ContentAlignment.MiddleLeft;
                            else if ((ctrl as TextBox).TextAlign == HorizontalAlignment.Right)
                                NewCtr.TextAlign = ContentAlignment.MiddleRight;

                            Parent.Controls.Add(NewCtr);
                            Parent.Controls.Remove(ctrl);
                            NewCtr.Click += new EventHandler(Control_Click);
                            NewCtr.BringToFront();
                        }
                    }
                    else if (ctrl is ComboBox)
                        (ctrl as ComboBox).DropDownStyle = ComboBoxStyle.DropDownList;
                }
            }
        }


Manifestement quand j'essaye d'ecrire dans "txtTEST1" remplacé avec un Label et supprimé,
le label n'est pas modifié et garde la valeur initiale recupérée lors du remplacement.

Hypothese (a la con surement)

Le CLR compile l'ensemble en affectant une adresse spécifique,en mémoire , à chaque contrôle <TextBox> .
Le nouveau contrôle créé <Label> possède lui une autre adresse. Le fait de supprimer le controle <TextBox>
ne doit pas suffire à effacer l'adresse. Peut-être que le GC ne fait pas son boulot, ou n'as pas encore eu le
temps de le faire, ou n'est pas prévu pour ca, ce qui expliquerai que je puisse écrire dans un contrôle
supprimé (et récupérer la valeur en mode debug)

Question :

QuoiCommenntQu'onPeutFAIRE pour que les adresses soient les mêmes afin que mes Labels puissent êtres modifiées.

Je tourne un peu en rond donc j'abuse de votre patience et de vos compétences pour m'aider à résoudre
ce problème.

MERCI D'AVANCE A TOUS

MisterMok
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 9 nov. 2012 à 08:54
1
Merci
Salut,

Je ne suis pas sur que tu puisse faire un cast d'un objet textbox en objet label. Si je devais faire cette manip, j'aurais fait comme ça (mais pas tester) :

1) Changer la propriété readonly du textbox à TRUE
2) Changer la couleur de fond du textbox à transparent
3) Changer le contour du textbox à "none"

C'est pas très joli dans le sens ou tu donnes l'apparence d'un label à ton textbox.

En espérant que cela t'aide un peu

@+

SD

Merci dodo7263 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de dodo7263
Meilleure réponse
BarthOlivier 133 Messages postés mercredi 6 mars 2002Date d'inscription 27 novembre 2012 Dernière intervention - 14 nov. 2012 à 10:53
1
Merci
Le souci c'est que j'ai une grosse application, et je me vois pas reprendre toutes les textBox de mes forms, en les doublant par des labels, et de retoucher au code (assez volumineux) pour faire le choix .. .. ..

Dès que je m'y remet, je vais essayer de m'orienter vers une autre solution, peut-être en interceptant un event sur le txtbox (mousedown ou mouseup) en lui ôtant le focus et en affichant mon propre clavier.

Merci tout de même de vos conseils.

MisterMok

Merci BarthOlivier 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de BarthOlivier
BarthOlivier 133 Messages postés mercredi 6 mars 2002Date d'inscription 27 novembre 2012 Dernière intervention - 9 nov. 2012 à 09:24
0
Merci
Merci de ta réponse.

En fait j'y avais pensé, le souci est que lorsque le contrôle à le focus, on a tout de même le crochet d’écriture
(même si ce qui est envoyé par le clavier est bien inhibé). Ce qui déclenche l'ouverture du clavier virtuel sur les
tablette tactiles -> ce que j'essaye de contourner.

Pour faire court, j'ai une application PC que je porte sous tablette PC. L’inconvénient est que le clavier virtuel
sur les tablettes prend toute la place de l’écran (ou presque) ce qui cache bien souvent les zones d'écriture.
(dure de taper quelque chose quand on est pas sur de ce qu'on a déjà écrit). Donc le but est de faire mon propre
clavier disposant d'une zone de texte afin de voir ce que l'on fait. (le nombre de caractères reste suffisant pour
rester sur une seule ligne)

Il y a toujours la solution de désactiver le clavier virtuel, ce que j'ai déjà fait faire pour une application spécifique
mais pas pratique si un client utilise sa tablette pour autre chose.

Sinon peut-être surcharger un TextBox en essayant de contourner les messages .. je sais pas ...

MisterMok
Commenter la réponse de BarthOlivier
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 14 nov. 2012 à 10:19
0
Merci
Salut,

Je ne m'aventurerais pas à répondre à des questions de GC, ou de problèmes d'adressages de composants divers et variés, étant donné que j'y connais pas grand chose là-dessus ^^
Par contre, tu n'a rien mis sur la manière dont tu écris dans ton contrôle !!

Du coup, je me permets une suggestion (surement à la con aussi ^^) :
Ne pourrait-tu pas simplement, quand tu va écrire dans ton contrôle, choisir avec une bête condition si tu va écrire dans le label ou dans la textebox ?
Et ce faisant, il faudrait que tu crée dès le départ les 2 contrôles (un peu plus lourd, mais efficace ^^), et que tu masque les labels ?
Dans ce cas, dans ta méthode de remplacement, tu fais juste :
if (ctrl is TextBox)
{
    ctrl.Hide;
    labelXX.Show;    //avec un indice correspondant au ctrl actuel
}

Et du coup, pour écrire, ce serait (avec le même foreach(Control ctrl in ListControl) ) :
if(ctrl.Visible)
{
    ctrl.text = "txtTEST1";
}
else if (labelXX.Visible)    //avec un indice correspondant au ctrl actuel
{
    labelXX.text = "txtTEST1";
}
else
{
    labelError.text : "WTF ???";
}


J'espère ne pas dire de conneries par rapport à ce que tu demande, mais je me dis que souvent la solution la plus simple est encore la meilleure ^^
Mad Keyboard
Commenter la réponse de madkeyboard

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.