【问题标题】:Drag Telerik RadTreeview node to Textbox in C#将 Telerik RadTreeview 节点拖到 C# 中的文本框
【发布时间】:2014-11-19 10:27:39
【问题描述】:

我想在 C# winform 中将一个节点从 Telerik RadTreeviw 拖到我的 Textbox。 我查看了this solution,但它适用于Microsoft Treeview,它不适用于Telerik,因为RadTreeview 这部分变得混乱

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

有人知道我的Telerik RadTreeView 的可行解决方案吗?

【问题讨论】:

    标签: c# winforms 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);
        }
    }
    

    【讨论】:

    • 谢谢!它工作正常。我还添加了一些代码。它有一个在MouseMove 事件中发生的错误。我在我的代码中修复了它
    • 很高兴能帮上忙。
    【解决方案2】:

    我在@checho 中添加了一些代码,这样我就可以在我的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;
                }
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2014-08-14
      • 2014-08-13
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2017-01-23
      相关资源
      最近更新 更多