Focus

MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 - 6 févr. 2006 à 15:20
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 - 8 févr. 2006 à 10:54
Je dispose d'un FlowLayoutPanel contenu dans un SplitContainer
et d'un TreeView.
lorsque je clique avec la souris sur un item du treeview celui ci obtient le focus et je veux juste apres ce clique pouvoir utiliser le clavier pour
le FlowLayoutPanel ( je capture le KeyDown du container)
Mais voilà le focus reste au treeview et je n'arrive pas a lui enlever.
j'ai testé la méthode focus sur le container et le flowlayoutpanel mais rien de se passe .

Merci de votre aide !

13 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 15:34
Bonjour,

Un panel ne peut pas recevoir le focus.

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 févr. 2006 à 15:40
Désolé je n'ai pas indiqué que lorsque jappuie sur la touche tabulation tout fonctionne sans probleme : quelle est donc le control qui recoit le focus ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 16:18
Le contrôle suivant du formulaire dans l'ordre de tabulation.
Tu peux reproduire ce comportement via SelectNextControl.

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 févr. 2006 à 16:57
Ca ne fonctionne pas la méthode renvoie false , j'ai vérifié le tabstoponly il n'y a pas de problème de ce coté là.
Merci d'essayer de m'aider en tout cas !
0

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

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 17:46
Euh, tu veux faire quoi au juste ?

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 févr. 2006 à 18:44
Je veux pouvoir naviguer dans mon FlowLayoutPanel à l'aide des touches du clavier.
Etant donné que le FlowLayoutPanel n'as pas d'évenement KeyDown j'utilise l'évenement Keydown du splitcontainer qui contient le FlowLayoutPanel.
Je veux pouvoir naviguer juste apres que l'utilisateur ai cliqué sur un treeNode or celui-ci garde le focus et si j'utilise le clavier je naviguerai dans le TreeView !
Euh si je ne suis toujours pas clair dis le moi :)
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 18:49
En gros tu voudrais que les notifications d'appuis sur les touches fléchées te soit transmises avant de l'être au contrôle ?

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 févr. 2006 à 19:36
Non car même si je le recois avant ca sera tout de même transmis au contrôle : le treeView gardera son element selectionné or veux qu'il perde le focus :/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 20:59
Ah oui, je vois, je n'avais pas saisit le fait que la demande de changement de focus échoue du fait même qu'il s'agisse du contrôle TreeView.
Je pense que le contrôle redemande le Focus directement après la levée des events.

/*
coq
MVP Visual C#
*/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 21:00
Et tout à l'heure j'ai fait une erreur : les panels peuvent prendre le focus.

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 févr. 2006 à 21:44
Ok mais que faire ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 févr. 2006 à 21:57
Euh, une petite bidouille, faut de mieux : on vas utiliser les filtres de messages (implémentation de IMessageFilter) afin de reforcer la perte de focus, et ce après la fin de traitement des messages par le contrôle.
Mais bon si tu peux faire sans le contrôle TreeView ça serais peut être mieux.

Ca peut donner quelquechose de ce genre :

public partial class Form1 : Form, IMessageFilter
{
public Form1()
{
InitializeComponent();


// ajout du filtre
Application.AddMessageFilter(this);
}


private bool _mustKillTreeViewFocus = false;


#region IMessageFilter Members


public bool PreFilterMessage(ref Message m)
{
if (this._mustKillTreeViewFocus)
{
this.flowLayoutPanel1.Focus();


if ( !this.flowLayoutPanel1.Focused )
this._mustKillTreeViewFocus = false;
}


return false;
}


#endregion


protected override void OnClosed(EventArgs e)
{
try
{
// retrait du filtre
Application.RemoveMessageFilter(this);
}
catch { }


base.OnClosed(e);
}


private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
this._mustKillTreeViewFocus = true; // on demande à forcer la perte de focus du treeview
this.flowLayoutPanel1.Focus();
}
}

Mais bon, je voudrais bien avoir une autre solution si elle existe ^^

/*
coq
MVP Visual C#
*/
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
8 févr. 2006 à 10:54
Bon ca fonctionne mais c'est beaucoup de bidouillage.
On peut aussi imaginer un timer de quelques milliseconde qui se lance à la fin de l'event mais c'est encore plus bidouillage :)

Merci beaucoup pour ton aide et j'espère que quelqu'un nous donnera une solution satisfaisante afin
d'enfin pouvoir dormir l'esprit serein :)
0
Rejoignez-nous