我有这个简单的代码,当用户离开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
答案 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
单次