TreeNode.BeginEdit()的问题

时间:2011-07-06 13:13:21

标签: c# .net winforms treeview treenode

我正在使用WinForms TreeView并对AfterLabelEdit事件做出反应。这是代码的片段:

if (e.Label.Contains("|"))
{
  if (WantAutofix())
  {
    label = e.Label.Replace('|', '_');
  }
  else
  {
    e.CancelEdit = true;
    e.Node.BeginEdit();
    return;
  }
}

问题是当用户不想自动修复坏字符时,节点不会保持编辑模式。有什么方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

要记住的一些事项:

  1. AfterLabelEdit事件在引发后始终以编辑模式结束,即使您在事件处理程序中间调用BeginEdit也是如此。您可以使用TreeView.BeginInvoke来“跳过”这一点,方法是在TreeView执行其操作后再次启动EditMode。 (注意:这不会创建新的线程或竞争条件,它只会延迟1个窗口消息的方法。)有关此事件here的一些问题的更多信息(虽然它表明我认为是一个更糟糕的解决方案。)
  2. 如果用户没有进行任何更改,则
  3. e.Labelnull,因此当我们使用BeginInvoke“跳过”时,就好像用户没有进行任何更改,因此我们还需要处理这种情况。
  4. 在这种情况下,BeginInvoke是一种可接受的解决方法,在这种情况下你会发现它非常可靠。
  5. 对我来说非常好用.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();
                    }