简体   繁体   English

将Telerik RadTreeview节点拖到C#中的“文本框”中

[英]Drag Telerik RadTreeview node to Textbox in C#

I want to drag a node from Telerik RadTreeviw to my Textbox in C# winform . 我想将一个节点从Telerik RadTreeviw拖到C# winform Textbox I looked at this solution but it's for Microsoft Treeview and it's not working on Telerik , because RadTreeview just gets messy with this part 我看了看这个解决方案,但是它是用于Microsoft Treeview ,并且不能在Telerik ,因为RadTreeview只是RadTreeview了这部分

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

Does anyone knows a working solution in my case for Telerik RadTreeView ? 在我的情况下,有人知道Telerik RadTreeView解决方案吗?

Here is how to drag a node from RadTreeView to RadTextBox (can be replaced with the standard TextBox too, as in fact HostedTextBox is the standard one) 这是将节点从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);
    }
}

I added some codes to @checho's so that I can drag & drop nodes in my RadTreeView without having to set its AllowDragDrop=true . 我在@checho的代码中添加了一些代码,以便可以在RadTreeView拖放节点,而不必设置其AllowDragDrop=true

I added two RadioButtons to my form to change Copy and Cut mode when dragging between nodes. 我在窗体中添加了两个RadioButtons以在节点之间拖动时更改“ Copy和“ Cut模式。

Here's my code 这是我的代码

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM