如何在 WinForms 中禁用 TreeView 的节点重命名?

Posted

技术标签:

【中文标题】如何在 WinForms 中禁用 TreeView 的节点重命名?【英文标题】:How can I disable node renaming for the TreeView in WinForms? 【发布时间】:2011-06-22 05:21:56 【问题描述】:

是否可以在单击树节点时禁用进入“重命名”模式的选项? 我不想完全禁用重命名,只是不允许通过单击节点来执行此操作。

【问题讨论】:

您是在说将 LabelEdit 属性设置为 false 吗? 不,这样做将完全禁用重命名。我不想那样做。 我们在谈论什么 TreeView? WPF? WinForms? 这听起来是个好主意。我的意思是,让用户拥有他们知道和期望的 UI 习语太容易了。它让他们保持警觉,让他们保持敏锐。 所以关闭LabelEdit。当他们按 F2 或从上下文菜单中选择一个项目时,显示一个用于更改名称的替代 UI(例如一个包含他们可以输入新名称的文本框的对话框)。当LabelEdit 关闭时,您仍然可以通过编程方式更改节点的名称。 【参考方案1】:

我不知道您为什么要更改默认行为,但无论如何这里有一个可能的解决方案,可以在 LabelEdit 设置为 true 的情况下编辑节点。

只需捕获 BeforeLabelEdit 事件并取消它,除非发生了您的特定操作。以下代码为 F2 按键执行此操作:

        bool _allowNodeRenaming;

        private void treeView1_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
        
            if (!_allowNodeRenaming)
            
                e.CancelEdit = true;
            

            _allowNodeRenaming = false;
        

        private void treeView1_KeyDown(object sender, KeyEventArgs e)
        
            if (e.KeyCode == Keys.F2)
            
                _allowNodeRenaming = true;
                treeView1.SelectedNode.BeginEdit();
            
        

【讨论】:

【参考方案2】:

您必须根据需要打开和关闭 LabelEdit 属性:

    private void startLabelEdit() 
        treeView1.LabelEdit = true;
        treeView1.SelectedNode.BeginEdit();
    

    private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) 
        treeView1.LabelEdit = false;
    

请注意,这有副作用,LabelEdit 属性是本机 Windows 控件的样式标志。更改它需要完全破坏窗口并从头开始重新创建它。最明显的副作用是窗口在创建后重绘自身时的小闪烁。可能还有其他的,我自己没发现有什么问题。

【讨论】:

以上是关于如何在 WinForms 中禁用 TreeView 的节点重命名?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# winforms 应用程序中使用文本框过滤 Treeview

为啥 WinForms 中的 TreeView 会意外崩溃?

如何在 TreeView 中禁用或修改 TreeCell 的填充

Winforms treeview,递归检查子节点问题

QML:如何在 TreeView 和 TableView 禁用边框?

带列的 TreeView