TreeNode.BeginEdit()的问题

Mig*_*gol 6 .net c# treeview treenode winforms

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

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

问题是当用户不想自动修复坏字符时,节点不会保持编辑模式.有任何解决这个问题的方法吗?

Kev*_*ick 3

需要记住以下几点:

  1. 即使您在事件处理程序的中间调用,事件AfterLabelEdit在引发后始终会结束编辑模式。BeginEdit您可以TreeView.BeginInvoke通过在 TreeView 执行其操作后再次启动 EditMode 来“跨越”这一点。 (注意:这不会创建新的线程或竞争条件,它只是延迟 1 个窗口消息的方法。)这里 有关于此事件的一些问题的更多信息(尽管它表明我认为是一个更糟糕的解决方案) 。
  2. e.Label就是null如果用户没有进行任何更改,那么当我们使用 BeginInvoke 进行“跳跃”时,就好像用户没有进行任何更改一样,所以我们也需要处理这种情况。
  3. 在这种情况下,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;
    }
Run Code Online (Sandbox Code Playgroud)