C#TreeView SetFocus两次激活离开事件

时间:2010-11-10 13:28:06

标签: c# .net winforms treeview

我有这个简单的代码,当用户离开TextBox控件时,TreeView会聚焦:

    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事件两次:

离开..
离开..

但是如果我们将焦点设置为其他控件,则只会触发一个Leave事件。

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

谢谢, RG

2 个答案:

答案 0 :(得分:3)

    this.treeView1.Focus();

在由于聚焦事件(如Leave)而调用的事件处理程序中使用Focus()方法。如果您需要阻止焦点更改,请改用Validating事件。设置e.Cancel = true会停止它。

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

答案 1 :(得分:0)

鉴于没有代码可以连接事件,我猜你是从设计师那里做到的,这意味着一行代码,如

textBox1.Leave += new EventHandler(textBox1_Leave);

将被添加到Form1.designer.cs中,检查此文件以确保该行不存在多次,因为每次运行此行时您将获得一个事件触发器,因此如果您运行该行离开文本框时,离开事件的3次将触发3次!

HTH

单次