将Telerik RadTreeview节点拖到C#中的Textbox

时间:2014-11-19 10:27:39

标签: c# winforms telerik radtreeview

我想将节点从Telerik RadTreeviw拖到C#Textbox中的winform。 我查看了this solution,但这是Microsoft Treeview,并且它不适用于Telerik,因为RadTreeview只是弄乱了这部分

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

有人知道Telerik RadTreeView我的案例中的工作解决方案吗?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

我在@ checho&s中添加了一些代码,以便我可以拖动&删除RadTreeView中的节点,而不必设置其AllowDragDrop=true

我在表单中添加了两个RadioButtons,以便在节点之间拖动时更改CopyCut模式。

这是我的代码

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