我正在使用WinForms TreeView
并对AfterLabelEdit
事件做出反应。这是代码的片段:
if (e.Label.Contains("|"))
{
if (WantAutofix())
{
label = e.Label.Replace('|', '_');
}
else
{
e.CancelEdit = true;
e.Node.BeginEdit();
return;
}
}
问题是当用户不想自动修复坏字符时,节点不会保持编辑模式。有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
要记住的一些事项:
AfterLabelEdit
事件在引发后始终以编辑模式结束,即使您在事件处理程序中间调用BeginEdit
也是如此。您可以使用TreeView.BeginInvoke
来“跳过”这一点,方法是在TreeView执行其操作后再次启动EditMode。 (注意:这不会创建新的线程或竞争条件,它只会延迟1个窗口消息的方法。)有关此事件here的一些问题的更多信息(虽然它表明我认为是一个更糟糕的解决方案。)e.Label
为null
,因此当我们使用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;
}
答案 1 :(得分:0)
您可以尝试异步发生BeginEdit():
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
if (e.Label.Contains("|"))
{
if (WantAutofix())
{
}
else
{
e.CancelEdit = true;
BeginInvoke(new ActionDelegate(new NodeBeginEditAsync(e.Node).Execute));
return;
}
}
}
public class NodeBeginEditAsync
{
private readonly TreeNode _node;
public NodeBeginEditAsync(TreeNode node)
{
_node = node;
}
public void Execute()
{
_node.BeginEdit();
}
}
public delegate void ActionDelegate();
这样,在新的BeginEdit尝试接管之前,CancelEdit有机会完成。
答案 2 :(得分:0)
如果用户想要自动修复,请使用EndEdit并替换“错误字符”
答案 3 :(得分:0)
try this...
TreeNode node = tv.SelectedNode;
if (tv.SelectedNode.Parent == null)
{
node.TreeView.LabelEdit = false;
}
else
{
node.Text = FieldName.Text;
if (node == null) { return; }
node.TreeView.LabelEdit = true;
node.BeginEdit();
}