后标签编辑树视图处理程序c#

后标签编辑树视图处理程序c#,c#,winforms,treeview,label,C#,Winforms,Treeview,Label,我需要根据用户在节点标签版本中所写的内容,用其他文本重写该标签。例如,如果用户编写了“NewNodeName”,我希望完成编辑后的节点文本为“S:NewNodeName”。 我尝试了这两种代码,但我不知道为什么这两种代码都不起作用 private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { e.Node.Text = "S :"+ e.Label; } 而且

我需要根据用户在节点标签版本中所写的内容,用其他文本重写该标签。例如,如果用户编写了“NewNodeName”,我希望完成编辑后的节点文本为“S:NewNodeName”。 我尝试了这两种代码,但我不知道为什么这两种代码都不起作用

  private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
    {
        e.Node.Text = "S :"+ e.Label;
    }
而且:

        private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
    {
        treeView1.SelectedNode.Text = "S :"+ e.Label;
    }

是,不起作用,文本属性在该事件运行后获取标签值。这就是e.Cancel起作用的原因。因此,您指定的文本值将再次被引发此事件后运行的代码覆盖。本机Windows控件内部的代码

没有AfterLabeledit事件,您不能更改事件处理程序中的e.Label,您需要一个技巧。在事件停止运行后更改Text属性。通过使用Control.BeginInvoke()优雅地完成。像这样:

    private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { e.Node.Text = "S: " + e.Node.Text; });
    }

现在回答这个问题已经很晚了,但这里有另一个解决方案:

1) 在调用BeginEdit()之前,删除节点标签中希望用户不要编辑的部分

2) 在AfterLabelEdit()中,根据需要设置节点文本,并设置NodeLabelEditEventArgs.CancelEdit=true,以便文本用户输入不会替换您设置的文本

private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Node == null) return;
    e.Node.Text = e.Node.Text.Substring(3, e.Node.Text.Length - 3);
    e.Node.BeginEdit();
}
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
    e.Node.Text = "S :" + e.Label;
    e.CancelEdit = true;
}

嗨,汉斯,它工作完美无瑕。这就像是你给我的一系列好答案中的第三个,非常感谢。xD…我认为这些问题很好,至少不是琐碎的。你的回答很准确。例如,在这个问题中,当我考虑如何完成我所需要的任务时,我从未想过使用委托调用。现在我又有了一个解决方案,我相信其他用户会发现你的答案很有用,VoteUp因为这在我的情况下对我很有效,我想用一个新的节点替换节点,而不是重新标记节点本身(我知道这很奇怪,但我有我的理由)。无论如何,我自己想出的CancelEdit技巧并没有完全起作用——节点将被替换,但将保持在“编辑”模式(即使有很多对EndEdit的调用)。谢谢有人能解释一下为什么这个解决方案有效吗?委托是否在事件结束后执行?我对执行的顺序有点模糊。