复制/粘贴Treeview节点标签

Ger*_*ell 1 .net treeview winforms

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

我在想两个选择:

1)为Controls添加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
}
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法呢?

我不介意样本是在C#还是VB中.

谢谢!

Han*_*ant 5

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);
}
Run Code Online (Sandbox Code Playgroud)