New to Telerik UI for WinForms? Start a free 30-day trial
Drag-Drop from RadRibbonBar to RadTreeView.
Updated over 6 months ago
Environment
| Product Version | Product | Author |
|---|---|---|
| 2022.2.510 | RadRibbonBar for WinForms | Dinko Krastev |

Solution
To add Drag-Drop between these two controls, we are going to use their drag-drop service: RadDragDropService and TreeViewDragDropService. We need to subscribe to their PreviewDragOver and PreviewDragDrop events and in their event handler we will convert the drag element. Important part here is that we need to allow the drag operation on both controls and their elements by using the AllowDrag property. The following code demonstrate this approach.
C#
public partial class RibbonTreeForm : Form
{
private RadDragDropService ribbonDragDropService = new RadDragDropService();
public RibbonTreeForm()
{
InitializeComponent();
this.radTreeView1.AllowDragDrop = true;
TreeViewDragDropService dragDropService = this.radTreeView1.TreeViewElement.DragDropService;
dragDropService.PreviewDragOver += this.OnTreeViewDragDropServicePreviewDragOver;
dragDropService.PreviewDragDrop += this.OnTreeViewDragDropServicePreviewDragDrop;
this.radRibbonBar1.MouseDown += this.OnRadRibbonBarMouseDown;
ribbonDragDropService.PreviewDragOver += this.OnRadRibbonDragDropServicePreviewDragOver;
ribbonDragDropService.PreviewDragDrop += this.OnRadRibbonDragDropServicePreviewDragDrop;
this.radRibbonBarGroup1.AllowDrop = true;
this.radRibbonBarGroup2.AllowDrop = true;
this.button1.AllowDrag = true;
this.button2.AllowDrag = true;
this.button3.AllowDrag = true;
this.button4.AllowDrag = true;
}
private void OnRadRibbonDragDropServicePreviewDragOver(object sender, RadDragOverEventArgs e)
{
if (e.HitTarget is RadTreeViewElement || e.HitTarget is TreeNodeElement)
{
e.CanDrop = true;
}
}
private void OnRadRibbonDragDropServicePreviewDragDrop(object sender, RadDropEventArgs e)
{
RadTreeViewElement treeViewElement = e.HitTarget as RadTreeViewElement;
TreeNodeElement nodeElement = e.HitTarget as TreeNodeElement;
RadButtonElement button = e.DragInstance as RadButtonElement;
RadTreeNodeCollection nodes = null;
if (treeViewElement != null)
{
nodes = treeViewElement.Nodes;
}
else if (nodeElement != null)
{
nodes = nodeElement.Data.Nodes;
nodeElement.Data.Expand();
}
if (nodes != null)
{
nodes.Add(new RadTreeNode(button.Text));
button.Parent.Children.Remove(button);
}
}
private void OnRadRibbonBarMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
RadButtonElement button = this.radRibbonBar1.ElementTree.GetElementAtPoint(e.Location) as RadButtonElement;
if (button != null && button.FindAncestor<RadRibbonBarGroup>() != null)
{
ribbonDragDropService.Start(button);
}
}
}
private void OnTreeViewDragDropServicePreviewDragDrop(object sender, Telerik.WinControls.RadDropEventArgs e)
{
RadRibbonBarGroup ribbonBarGroup = e.HitTarget as RadRibbonBarGroup;
if (ribbonBarGroup != null)
{
TreeNodeElement draggedNode = e.DragInstance as TreeNodeElement;
RadButtonElement button = new RadButtonElement(draggedNode.Data.Text);
button.AllowDrag = true;
ribbonBarGroup.Items.Add(button);
draggedNode.Data.Remove();
e.Handled = true;
}
}
private void OnTreeViewDragDropServicePreviewDragOver(object sender, Telerik.WinControls.RadDragOverEventArgs e)
{
RadRibbonBarGroup ribbonBarGroup = e.HitTarget as RadRibbonBarGroup;
if (ribbonBarGroup != null)
{
e.CanDrop = true;
}
}
}