[英]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.