我需要根据用户在节点标签版本中编写的内容,用其他文本重写该标签。用户编写“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;
}
答案 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;
}