2010-11-10 36 views
1

我有这个简单的代码,当用户离开TextBox控件,其中,TreeView控件得到集中:C#的TreeView SetFocus的射击离开事件两次

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(); 
    } 
} 

如果我们执行这个代码Leave事件被触发两次:

离开..
离开..

但是,如果我们将焦点设置其他的控制,只有一个离开事件。

这是TreeView的问题吗?你知道任何解决方法吗?我们应该向微软报告吗?

感谢, RG

回答

0

由于没有代码有要连接我猜你这意味着一行代码,如

textBox1.Leave += new EventHandler(textBox1_Leave); 

设计师做了本次活动将已添加到Form1.designer.cs中,请检查此文件以确保该行不会多次存在,因为每次运行此行时都会得到一个事件触发器,因此如果您运行该行3次离开事件将在您离开文本框时触发3次!

HTH

单次

+0

我已经检查过,并且该事件只安装一次。 – RGil 2010-11-10 15:35:34

3
this.treeView1.Focus(); 

使用Focus()方法这就是所谓的,因为一个焦点事件,像离开事件处理程序。如果您需要防止焦点更改,请改用验证事件。设置e.Cancel = true会停止它。

但请注意,对于TreeView来说这样做不是很合乎逻辑,用户无法做任何事情来改变控件的状态。你会陷入用户。也许这是意图,确保用户仍然可以关闭窗口。如果不是,那么您可能需要FormClosing事件来强制e.Cancel返回false。

+0

小心分享为什么? – 2010-11-10 13:54:37

+1

@Joel - 当Enter和Leave被触发时,聚焦逻辑处于过渡状态。由于验证事件,逻辑非常困难,它可以在已经发生的*之后取消焦点更改*。还有更多这样的工件,使用Validating事件处理程序中的MessageBox引起焦点也会导致问题。当已经有GotFocus和LostFocus时,Enter和Leave的原因就存在了。丑陋的东西。 – 2010-11-10 13:59:07