gpt4 book ai didi

.net - 复制/粘贴 Treeview 节点标签

转载 作者:行者123 更新时间:2023-12-02 01:09:03 27 4
gpt4 key购买 nike

我想用 treeView 支持复制/粘贴。如果选择节点,则必须复制/粘贴该节点。如果您正忙于重命名标签,则必须复制/粘贴标签中的文本。还有复制/粘贴按钮,它们必须具有与快捷键 Ctrl+C 和 Ctrl+V 相同的功能。

我在想两个选择:

1) 为控件添加一个 keydown 方法。如何为标签添加对复制/粘贴的支持?

TreeNode selectedNode = trvProjects.SelectedNode;    
if (selectedNode.IsEditing)
{
// Copy Label
selectedNode.Copy(); // .Copy / .Paste() are not supported. I need help with this
}
else
{
// Copy Node
CopyNode(selectedNode); // Got this working
}

2) 有没有一种方法可以让标签编辑使用复制/粘贴中的构建,如果选择了节点,则启动自定义代码?

有更好的方法吗?

我不介意示例是用 C# 还是 VB 编写的。

谢谢!

最佳答案

TreeView 控件使用动态创建的 TextBox 来编辑标签。您可以获得该文本框的句柄并将 WM_CUT、WM_PASTE 和 WM_COPY 消息发送给它。向您的项目添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件拖放到窗体上。您可以使用其 IsEditing 属性或其 BeforeLabelEdit 和 AfterLabelEdit 事件来检查您的快捷方式是否有效。

using System;
using System.Windows.Forms;

class MyTreeView : TreeView {
public bool IsEditing { get; private set; }
public void Cut() { SendMessage(GetEditControl(), 0x300, IntPtr.Zero, IntPtr.Zero); }
public void Copy() { SendMessage(GetEditControl(), 0x301, IntPtr.Zero, IntPtr.Zero); }
public void Paste() { SendMessage(GetEditControl(), 0x302, IntPtr.Zero, IntPtr.Zero); }

protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) {
IsEditing = true;
base.OnBeforeLabelEdit(e);
}
protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e) {
IsEditing = false;
base.OnAfterLabelEdit(e);
}
private IntPtr GetEditControl() {
// Use TVM_GETEDITCONTROL to get the handle of the edit box
IntPtr hEdit = SendMessage(this.Handle, 0x1100 + 15, IntPtr.Zero, IntPtr.Zero);
if (hEdit == IntPtr.Zero) throw new InvalidOperationException("Not currently editing a label");
return hEdit;
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}

关于.net - 复制/粘贴 Treeview 节点标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191981/

27 4 0