TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010
-
10 nov. 2009 à 10:33
TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010
-
10 nov. 2009 à 13:34
Bonjour,
J'ai pour but de réaliser une autocomplétion un peu plus 'sophistiquée' que l'autocomplétion
proposée avec le AutoCompleteStringCollection. (propriété des controles TextBox, ComboBox, ...)
Je dois en effet rechercher des chaines de caracteres 'ressemblantes', incluant donc des possibilités
de fautes de frappe, et je n'ai malheureusement pas pu customiser le comportement de l'autocomplétion
du framework.
J'ai donc commencé a faire du code 'a la mano'. Au bout de la frappe de quelques caractères dans une TextBox,
celle-ci affiche un ContextMenuStrip des éléments ressemblants.
Le problème est qu'une fois le ContextMenuStrip affiché, j'ai beau redonner le focus a ma TextBox, les évènements
claviers sont attrappés uniquement par le ContextMenuStrip, et je ne peux donc plus rentrer de texte dans le champ de
la TextBox
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 10 nov. 2009 à 10:58
Hello,
En fait soit tu met une variable Static que tu réutiliser au lost focus, soit lors du lost focus tu altère directement le texte de la textbox
Chris...
- La vérité n'est pas ailleurs, elle est sous le nez de chacun, quelques mouvements neuronale permettent de l'entrevoir -
MCPD (webform-winform) / MCSA / MCDST / MCT
TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010 10 nov. 2009 à 11:16
Salut,
Merci pour ta réponse, mais je n'ai pas tout compris...
Le probleme est :
- ma TextBox a bien le focus (this.MyTextBox.Focused = true)
- mon ContextMenuStrip est visible mais n'a pas le focus (this.MyContextMenu.Focused = false)
- le curseur 'Beam' apparait bien clignotant dans ma TextBox
Mais la frappe d'une touche au clavier est détectée au niveau du ContextMenuStrip.... (alors qu'il n'a pas le focus )
et donc, ma textbox ne se remplit plus et ne génère aucun évènement (TextChanged, KeyDown,...)
private void txtMatch_TextChanged(object sender, EventArgs e ) {
if (txtMatch.Text.Length > 3) {
List filtre = this.Collection.Matches(this.txtMatch.Text);
this.MenuStrip = new MatchMenuStrip(filtre, this);
this.MenuStrip.Show(this.txtMatch, new Point(0, this.txtMatch.Height));
this.Focus();
this.txtMatch.Focus();
this.txtMatch.Select(); //repasse le focus a la TextBox donc....
}
}
}
public class MatchMenuStrip : ContextMenuStrip {
#region Properties
private List _collection;
public List Collection {
get { return _collection; }
set { _collection = value; }
}
private UCAbstractMatch _userControl;
public UCAbstractMatch UserControl {
get { return _userControl; }
set { _userControl = value; }
}
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 10 nov. 2009 à 11:26
Effectivement j'avais mal pigé, pourquoi ne transfert tu pas ce que le contextmenustrip reçoi en frappe dans la textbox, histoire de contourner le pb ?
Car lorsque tu tape dans le textbox, il ouvre le context... et lui prend automatiquement le focus, donc soit tu redonne le focus à la textbox, soit tu transfert ce que lui reçoi histoire de "simuler" la frappe dans la textbox
Chris...
- La vérité n'est pas ailleurs, elle est sous le nez de chacun, quelques mouvements neuronale permettent de l'entrevoir -
MCPD (webform-winform) / MCSA / MCDST / MCT
TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010 10 nov. 2009 à 11:42
Il n'y a pas de mal, je m'étais certainement mal expliqué... ;)
<<donc soit tu redonne le focus à la textbox>> --> c'est fait! elle a le focus , le curseur clignotant et tout.
<<soit tu transfert ce que lui reçoi histoire de "simuler" la frappe dans la textbox>> --> j'y ai déja pensé, mais certaines
touches spéciales sont légèrement 'chaudes' a gérer (suppr, backspace, shift, etc....) et sont interprétés comme des touches de navigation
par le ContextMenuStrip (), et donc non relevées par les habituels KeyDown, KeyUp, ... . Cela revient donc pratiquement a développer un hook clavier.... Tout ça pour une TextBox mdr
En fait, je pensais que quelqu'un aurait posté un message du genre : Mais tu es c.. , tout ca c'est normal, tu as oublié de mettre
la propriété X a true/false sur le controle Y ;)
Chris...
- La vérité n'est pas ailleurs, elle est sous le nez de chacun, quelques mouvements neuronale permettent de l'entrevoir -
MCPD (webform-winform) / MCSA / MCDST / MCT
TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010 10 nov. 2009 à 12:56
L'evenement sur KeyDown (KeyEventArgs) n'a pas de propriété Cancel...
Il a deux propriétés interessantes : Handled et SupressKeyPress mais quelques soient les valeurs,
rien n'y change....
Je passe a une solution 'code pas clair' : Je ferme le ContextMenuStrip sur l'evenement KeyDown.
(la saisie fonctionne alors a nouveau sur la textbox)
Probleme : la touche qui a fermé le ContextMenuStrip n'est pas retournée a la TextBox.
Je vais essayer de faire fonctionner PostMessage de user32.dll pour simuler l'appui de la touche clavier
a la fermeture du ContextMenuStrip... (en gros c'est crade)
TotoLePaBo
Messages postés11Date d'inscriptionsamedi 23 février 2008StatutMembreDernière intervention22 août 2010 10 nov. 2009 à 13:19
Tout marche ou presque:
l'appui sur une touche classique et DEL ferme le ContextMenuStrip, et insere dans la TextBox, avec réouverture d'un
nouveau ContextMeuStrip.
Les touches de direction (gauche droite) ferment le ContextMenuStrip mais n'ont aucune action dans la TextBox
Le pire est la touche Backspace ou retour en début ligne qui donnent le focus aux ToolStripMenuItem.
Voila il y a encore du travail ;)
Je suis toujours preneur d'une solution moins 'crade'