要记住几件事:
- 事件在
AfterLabelEdit
引发后总是结束编辑模式,即使您BeginEdit
在事件处理程序的中间调用也是如此。您可以TreeView.BeginInvoke
通过在 TreeView 完成操作后再次启动 EditMode 来“跨越”它。 (注意:这不会创建新线程或竞争条件,它只会延迟 1 个窗口消息的方法。)这里 有关于此事件的一些问题的更多信息(尽管它表明我认为更糟糕的解决方案) .
e.Label
就是null
如果用户没有做任何改变,那么当我们用BeginInvoke“越级”时,就好像用户没有做任何改变,所以我们也需要处理这种情况。
- 在这种情况下,BeginInvoke 是一种可接受的解决方法,您应该会发现它在这种情况下非常可靠。
这对我来说效果很好,用 .NET 2.0 测试过:
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
//we have to handle both the first and future edits
if ((e.Label != null && e.Label.Contains("|") || (e.Label == null && e.Node.Text.Contains("|"))))
{
if (WantAutofix())
{
e.CancelEdit = true;
if(e.Label != null)
e.Node.Text = e.Label.Replace('|', '_');
else
e.Node.Text = e.Node.Text.Replace('|', '_');
}
else
{
//lets the treeview finish up its OnAfterLabelEdit method
treeView1.BeginInvoke(new MethodInvoker(delegate() { e.Node.BeginEdit(); }));
}
}
}
private bool WantAutofix()
{
return MessageBox.Show("You entered a |, you want me to AutoFix?", String.Empty, MessageBoxButtons.YesNo) == DialogResult.Yes;
}