afterlabeledit treeview handler c#

时间:2010-12-30 19:28:18

标签: c# winforms treeview 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;
    }

2 个答案:

答案 0 :(得分:6)

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

没有AfterAfterLabelEdit事件且您无法在事件处理程序中更改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 :(得分:2)

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

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;
}