【问题标题】:Copy / Paste Treeview Node Label复制/粘贴 Treeview 节点标签
【发布时间】:2013-10-04 22:52:38
【问题描述】:

我想支持使用 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。

谢谢!

【问题讨论】:

标签: .net winforms treeview


【解决方案1】:

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

【讨论】:

  • 我将 Control 类型从 TreeView 重命名为 MyTreeView,它就像一个魅力。谢谢!
【解决方案2】:
    private void treeXmlNode_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode.ToString() == "C")
        {
            if (treeXmlNode.SelectedNode != null)
            {
                e.Handled = true;
                this.KeyPreview = true;

                //copy node label to clipboard
                Clipboard.SetText(treeXmlNode.SelectedNode.Text);
            }
        }
    }

【讨论】:

    【解决方案3】:

    我用这段代码来复制:

        //copia a linha duploclick
        private void nametreeView_DoubleClick(object sender, EventArgs e)
        {
            Clipboard.SetText(nametreeView.SelectedNode.Text);
        }
    

    还有 control-v。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多