afterlabeledit Treeview 处理程序 C#

发布于 2024-10-09 11:21:04 字数 467 浏览 0 评论 0原文

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

i need to based in what the user wrote in the edition of a node label, rewrite that label with other text. Example if the user wrote "NewNodeName" I want that the node text after finish the edition be "S :NewNodeName".
I try this two codes and i don't know why neither work

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

and also:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不…忘初心 2024-10-16 11:21:04

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

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

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

Yes, doesn't work, the Text property gets the label value after this event runs. Which is why e.Cancel works. So the Text value you assigned will be overwritten again by code that runs after raising this event. Code inside of the native Windows control.

There is no AfterAfterLabelEdit event and you cannot alter e.Label in the event handler, you need a trick. Change the Text property after the event stopped running. Elegantly done by using Control.BeginInvoke(). Like this:

    private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { e.Node.Text = "S: " + e.Node.Text; });
    }
梦里兽 2024-10-16 11:21:04

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

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

It's quite late to answer this question, but here's another solution:

1) Remove the part that you want user not to edit of the node label right before you call BeginEdit()

2) In AfterLabelEdit(), set the node text as you want and set NodeLabelEditEventArgs.CancelEdit = true so that the text user input won't replace the text you set

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文