BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 2012
-
8 nov. 2012 à 17:32
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 2012
-
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.
dodo7263
Messages postés614Date d'inscriptionmercredi 10 septembre 2008StatutMembreDernière intervention 9 février 20176 9 nov. 2012 à 08:54
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.
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 14 nov. 2012 à 10:53
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.
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 9 nov. 2012 à 09:24
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 ...
madkeyboard
Messages postés100Date d'inscriptionmercredi 27 avril 2011StatutMembreDernière intervention21 décembre 20121 14 nov. 2012 à 10:19
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