Meilleur auteur de réponses
Combobox garde le focus

Question
-
Bonjour,
J'ai un combo, avec 3 evenements persos (Enter, DropDown, DrawItem). Lorsque je clic à coté, il conserve le focus !??
comboBoxLibelleRestoria.Enter += new EventHandler(comboBoxLibelleRestoria_Enter); comboBoxLibelleRestoria.DrawMode = DrawMode.OwnerDrawFixed; comboBoxLibelleRestoria.DrawItem += new DrawItemEventHandler(comboBoxLibelleRestoria_DrawItem); comboBoxLibelleRestoria.DropDown += new EventHandler(comboBoxLibelleRestoria_DropDown);
void comboBoxLibelleRestoria_Enter(object sender, EventArgs e) { if (comboBoxLibelleRestoria.Items.Count == 0) { var item = Util.ListArticles.Values.FirstOrDefault(art => art.ELEMENT_REPAS == this.labelElement.Text && art.LIBELLE_RESTORIA == comboBoxLibelleRestoria.Text); PopulateComboboxLibelleRestoria(this.labelElement.Text); comboBoxLibelleRestoria.SelectedItem = item; } }
void comboBoxLibelleRestoria_DrawItem(object sender, DrawItemEventArgs e) { Article item = (Article)((ComboBox)sender).Items[e.Index]; var lib = getArticleLibelleRecherche(item); e.DrawBackground(); using (SolidBrush br = new SolidBrush(e.ForeColor)) { e.Graphics.DrawString(lib, e.Font, br, e.Bounds); } e.DrawFocusRectangle(); }
void comboBoxLibelleRestoria_DropDown(object sender, EventArgs e){ ComboBox senderComboBox = (ComboBox)sender; int width = senderComboBox.DropDownWidth; Graphics g = senderComboBox.CreateGraphics(); Font font = senderComboBox.Font; int vertScrollBarWidth = (senderComboBox.Items.Count > senderComboBox.MaxDropDownItems) ? SystemInformation.VerticalScrollBarWidth : 0; int newWidth; foreach(Article art in((ComboBox)sender).Items){ newWidth = (int)g.MeasureString(getArticleLibelleRecherche(art), font).Width + vertScrollBarWidth; if(width < newWidth){ width = newWidth; }} senderComboBox.DropDownWidth = width; }
Quelqu'un aurait une idée ? un contournement ?
- Modifié Dekey_ mardi 12 juin 2012 12:11
Réponses
-
Bonjour Dekey,
Tu peux créer un bouton qui ne fait rien et ajouter une méthode à la Form comme ceci:
private void Form1_MouseClick(object sender, MouseEventArgs e) { button2.Focus(); }
Attention, un control visible = False ne prend pas un focus- Proposé comme réponse Gilles TOURREAUModerator dimanche 17 juin 2012 13:29
- Marqué comme réponse nikhoModerator mardi 19 juin 2012 08:34
Toutes les réponses
-
Bonjour,
On clique sur quoi ? A priori cela me semble normal si on clique sur qq chose qui ne peut pas prendre le focus comme le fond de la fenêtre ?
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
-
Bonjour Dekey,
Tu peux créer un bouton qui ne fait rien et ajouter une méthode à la Form comme ceci:
private void Form1_MouseClick(object sender, MouseEventArgs e) { button2.Focus(); }
Attention, un control visible = False ne prend pas un focus- Proposé comme réponse Gilles TOURREAUModerator dimanche 17 juin 2012 13:29
- Marqué comme réponse nikhoModerator mardi 19 juin 2012 08:34
-
Bonjour et merci pour vos réponses
J'ai effectivement ajouté un bouton de taille 0 sur ma Form et je lui passe le focus.
Cela marche , sauf sur un pc sous XP (un autre PC sur XP fonctionne).
Le projet était en Net 4.0. En repassant en 3.5 çà marche sur tous les postes.
-
C'était peut-être un niveau de SP différent sur les deux PCs et je comprends que ce comportement puisse varier (sur le plan du principe, que l'on ne puisse plus pouvoir donner le focus à un contrôle qui n'est de fait pas visible alors qu'on pouvait avant ne me surprendrait pas plus que cela).
Ma préférence personnel aurait été de résoudre le problème d'origine mais je n'ai pas compris le problème causé par ce comportement qui me semble normal (on a forcément un contrôle qui a le focus et cliquer sur le fond de la fenêtre qui n'est pas un contrôle et ne peut pas avoir le focus, laissera le focus sur le contrôle en cours). Je soupçonne que l'on voudrait en fait replier la liste déroulante plutôt que de donner le focus sur un autre contrôle ce que semble faire la liste de base sans pour autant perdre le focus ???
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
-
-
A vérifier mais dans ce cas je pense que l'on doit pouvoir donner le focus à la scrollbar (ce qui se passerait si l'utilisateur cliquait sur la scrollbar plutôt que le fond de la fenêtre pour réactiver le défilement) et le bouton deviendrait inutile...
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".