后标签编辑树视图处理程序c#
我需要根据用户在节点标签版本中所写的内容,用其他文本重写该标签。例如,如果用户编写了“NewNodeName”,我希望完成编辑后的节点文本为“S:NewNodeName”。 我尝试了这两种代码,但我不知道为什么这两种代码都不起作用后标签编辑树视图处理程序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; } 而且
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的调用)。谢谢有人能解释一下为什么这个解决方案有效吗?委托是否在事件结束后执行?我对执行的顺序有点模糊。