2013-10-04 2 views
1

treeView로 복사/붙여 넣기를 지원하고 싶습니다. 노드를 선택하면 노드를 복사/붙여 넣기해야합니다. 레이블의 이름을 바꿀 바쁜 경우 라벨의 텍스트를 복사/붙여 넣기해야합니다. 복사/붙여 넣기 버튼도 있으며 단축키 Ctrl + C 및 Ctrl + V와 동일한 기능을 수행해야합니다.Treeview 복사/붙여 넣기 노드 레이블

나는 두 가지 옵션을 생각했다 :

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인지 상관 없습니다.

감사합니다.

+0

이를보고하십시오. [http://stackoverflow.com/questions/4566388/copy-treeview-node][1] 여기서 도움을 얻을 수 있습니다. [1] : http://stackoverflow.com/questions/4566388/copy-treeview-node – mit

+0

감사합니다. 불행히도 전체 라벨 만 복사하고 붙여 넣기 만하고 커서가있는 위치/텍스트는 강조 표시하지 않습니다. –

+0

SendKeys.Send ("^ (c)"); // Ctrl + C 프로그래밍 방식으로 – albert

답변

4

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

컨트롤 유형을 TreeView에서 MyTreeView로 변경했으며 매력처럼 작동합니다. 고맙습니다! –

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