2014-11-19 1 views
0

Я хочу перетащить узел из Telerik RadTreeviw в мой Textbox в C# winform. я смотрел на this solution, но это для Microsoft Treeview и он не работает на Telerik, потому что RadTreeview просто получает грязно с этой частьюПеретащите Telerik узел RadTreeview в текстовое поле в C#

DoDragDrop(e.Node.Text, DragDropEffects.Copy); 

ли кто-нибудь знает, работающее решение в моем случае для Telerik RadTreeView?

ответ

1

Вот как перетащить узел из RadTreeView в RadTextBox (можно заменить стандартный TextBox тоже, как на самом деле HostedTextBox является стандартным)

public partial class Form1 : Form 
{ 
    Point clickedPoint; 
    bool mouseDown = false; 

    public Form1() 
    { 
     InitializeComponent(); 

     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.AllowDrop = true; 
     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.DragEnter += new DragEventHandler(HostedControl_DragEnter); 
     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.DragDrop += new DragEventHandler(HostedControl_DragDrop); 

     radTreeView1.MouseDown += new MouseEventHandler(radTreeView1_MouseDown); 
     radTreeView1.MouseMove += new MouseEventHandler(radTreeView1_MouseMove); 

    } 

    void HostedControl_DragDrop(object sender, DragEventArgs e) 
    { 
     RadTreeNode node = e.Data.GetData(typeof(RadTreeNode)) as RadTreeNode; 
     if (node != null) 
     { 
      radTextBox1.Text = node.Text; 
     } 
    } 

    void HostedControl_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void radTreeView1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (mouseDown && IsRealDrag(e.Location, clickedPoint)) 
     { 
      TreeNodeElement node = ((RadTreeView)sender).ElementTree.GetElementAtPoint(clickedPoint) as TreeNodeElement; 
      if (node != null) 
      { 
       ((RadTreeView)sender).DoDragDrop(node.Data, DragDropEffects.Copy | DragDropEffects.Move); 
      } 
      mouseDown = false; 
     } 
    } 

    void radTreeView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      mouseDown = true; 
      clickedPoint = e.Location; 
     } 
    } 

    private static bool IsRealDrag(Point mousePosition, Point initialMousePosition) 
    { 
     return (Math.Abs(mousePosition.X - initialMousePosition.X) >= SystemInformation.DragSize.Width) || 
      (Math.Abs(mousePosition.Y - initialMousePosition.Y) >= SystemInformation.DragSize.Height); 
    } 
} 
+0

Спасибо! он работает нормально. Я также добавил некоторые коды к нему. У этого есть ошибка, которая происходит в событии 'MouseMove'. Я исправил его в своем коде –

+0

Я рад, что смог бы помочь. – checho

0

Я добавил некоторые коды @ checho так, чтобы Я могу перетащить & в узел RadTreeView без необходимости устанавливать его AllowDragDrop=true.

Я добавил 2 RadioButtons в мою форму для изменения Copy и Cut режим при перетаскивании между узлами.

Вот мой код

public partial class Form1 : Form 
{ 
    Point clickedPoint; 
    bool mouseDown = false; 

    public Form1() 
    { 
     InitializeComponent(); 

     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.AllowDrop = true; 
     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.DragEnter += new DragEventHandler(HostedControl_DragEnter); 
     radTextBox1.TextBoxElement.TextBoxItem.HostedControl.DragDrop += new DragEventHandler(HostedControl_DragDrop); 

     radTreeView1.MouseDown += new MouseEventHandler(radTreeView1_MouseDown); 
     radTreeView1.MouseMove += new MouseEventHandler(radTreeView1_MouseMove); 
    radTreeView1.MouseMove += new MouseEventHandler(radTreeView1_DragEnter); 
    radTreeView1.MouseMove += new MouseEventHandler(radTreeView1_DragDrop); 

    } 

    void HostedControl_DragDrop(object sender, DragEventArgs e) 
    { 
     RadTreeNode node = e.Data.GetData(typeof(RadTreeNode)) as RadTreeNode; 
     if (node != null) 
     { 
      radTextBox1.Text = node.Text; 
     } 
    } 

    void HostedControl_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void radTreeView1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (mouseDown && IsRealDrag(e.Location, clickedPoint)) 
     { 
      TreeNodeElement node = ((RadTreeView)sender).ElementTree.GetElementAtPoint(clickedPoint) as TreeNodeElement; 
      if (node != null) 
      { 
       ((RadTreeView)sender).DoDragDrop(node.Data, DragDropEffects.Copy | DragDropEffects.Move); 
      } 
      mouseDown = false; 
     } 
    } 

    void radTreeView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      mouseDown = true; 
      clickedPoint = e.Location; 
     } 
    } 

    private static bool IsRealDrag(Point mousePosition, Point initialMousePosition) 
    { 
     return (Math.Abs(mousePosition.X - initialMousePosition.X) >= SystemInformation.DragSize.Width) || 
      (Math.Abs(mousePosition.Y - initialMousePosition.Y) >= SystemInformation.DragSize.Height); 
    } 

    private void radTreeView1_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = radioButtonCopy.Checked ? DragDropEffects.Copy : DragDropEffects.Move; 
    } 

    private void radTreeView1_DragDrop(object sender, DragEventArgs e) 
    { 

      RadTreeNode sourceNode = e.Data.GetData(typeof(RadTreeNode)) as RadTreeNode; 
      // Retrieve the client coordinates of the drop location. 
      Point targetPoint = rtvTree.PointToClient(new Point(e.X, e.Y)); 

      // Retrieve the node at the drop location. 
      RadTreeNode targetNode = rtvTree.GetNodeAt(targetPoint); 
      if (sourceNode != null && targetNode != null) 
      { 
       RadTreeNode clonedNode = (RadTreeNode) sourceNode.Clone(); 
       if (radioButtonCut.Checked) 
        sourceNode.Remove(); 
       targetNode.Nodes.Add(clonedNode); 
       targetNode.Expanded = true; 
      } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^