2010-11-10 9 views
1

Je possède ce code simple, où lorsque l'utilisateur quitte le contrôle TextBox, TreeView se concentré:C# TreeView événement congé de tir SetFocus deux fois

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

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.treeView1.Nodes.Add("A"); 
     this.treeView1.Nodes[0].Nodes.Add("A.A"); 

     this.treeView1.Nodes.Add("B"); 
     this.treeView1.Nodes[0].Nodes.Add("B.A"); 

    } 



    private void textBox1_Leave(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Leave.."); 
     this.treeView1.Focus(); 
    } 
} 

Si nous exécutons ce code l'événement Leave est tiré deux coups:

.. Laissez
.. Laissez

Mais si l'on met l'accent à un autre contrôle, un seul événement de congé est tiré.

Est-ce un problème de TreeView? Connaissez-vous une solution de contournement? Devrions-nous signaler cela à Microsoft?

Merci, RG

Répondre

0

Étant donné qu'il n'y a pas de code là pour câbler l'événement, je suppose que vous l'avez fait du concepteur qui signifie une ligne de code tel que

textBox1.Leave += new EventHandler(textBox1_Leave); 

sera ont été ajoutés à Form1.designer.cs, vérifiez ce fichier pour vous assurer que la ligne n'existe pas plus d'une fois car à chaque fois que cette ligne est exécutée, vous aurez un déclencheur d'événement, donc si vous exécutez la ligne 3 fois le congé l'événement se déclenchera 3 fois lorsque vous quitterez la zone de texte!

HTH

OneShot

+0

J'ai déjà vérifié cela, et l'événement est seulement installer une fois. – RGil

3
this.treeView1.Focus(); 

Est-ce pas utiliser la méthode mise au point() dans un gestionnaire d'événements qui est appelé à cause d'un événement mettant l'accent, comme le congé. Si vous devez empêcher un changement de focus, utilisez plutôt l'événement Validating. La définition de e.Cancel = true l'arrête.

Mais notez que ce n'est pas très logique de le faire pour un TreeView, il n'y a rien que l'utilisateur puisse faire pour modifier l'état du contrôle. Vous piégerez l'utilisateur. Peut-être que c'était l'intention, assurez-vous que l'utilisateur peut toujours fermer la fenêtre. Si ce n'est pas le cas, vous pourriez avoir besoin de l'événement FormClosing pour forcer e.Cancel à false.

+0

Vous voulez partager pourquoi? –

+1

@Joel - au moment où l'entrée et la sortie sont déclenchées, la logique de mise au point est dans un état de transition. La logique est difficile à cause de l'événement Validating, elle peut annuler les changements de focus * après * qu'ils se soient déjà produits. Il y a plus d'artefacts comme celui-ci, le fait de détourner le focus avec un MessageBox dans un gestionnaire d'événement Validating provoque également des problèmes. Et la raison pour laquelle Enter et Leave existe quand il y a déjà GotFocus et LostFocus. Trucs laids. –