我想支持使用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
}
2)对于标签编辑,是否有一种方法可以使用复制/粘贴中的内置,如果选择了节点,则会启动自定义代码?
有更好的方法吗?
我不介意样本是用C#还是VB。
谢谢!
答案 0 :(得分: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);
}
答案 1 :(得分:0)
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);
}
}
}
答案 2 :(得分:0)
我使用以下代码进行复制:
//copia a linha duploclick
private void nametreeView_DoubleClick(object sender, EventArgs e)
{
Clipboard.SetText(nametreeView.SelectedNode.Text);
}
和控制-v。