如何在 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 的填充