Workaround: class CustomTreeView : RadTreeView { //Replace the default element with the custom one protected override RadTreeViewElement CreateTreeViewElement() { return new CustomTreeViewElement(); } //Enable theming for the control public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } } } class CustomTreeViewElement : RadTreeViewElement { //Enable themeing for the element protected override Type ThemeEffectiveType { get { return typeof(RadTreeViewElement); } } protected override bool ProcessContextMenu(Point location) { RadTreeNode node = this.GetNodeAt(location); if (node == null) { RadContextMenu menu = new RadContextMenu(); RadMenuItem item = new RadMenuItem(); item.Text = "Add a root node"; menu.Items.Add(item); item.Click += item_Click; TreeViewContextMenuOpeningEventArgs args = new TreeViewContextMenuOpeningEventArgs(node, menu); OnContextMenuOpening(args); if (!args.Cancel) { menu.Show(this.ElementTree.Control, location); return true; } } return base.ProcessContextMenu(location); } private void item_Click(object sender, EventArgs e) { this.Nodes.Add(new RadTreeNode("New root")); } }
For the MS TreeView the HideSelection property gets or sets a value indicating whether the selected tree node remains highlighted even when the tree view has lost the focus. However, it doesn't work in RadTreeView.
To reproduce: add several nodes at design time in order to obtain a vertical scrollbar. Enable the drag and drop functionality by setting the AllowDragDrop property to true. If you start dragging you will notice that the RadTreeView doesn't auto-scroll when you drag close to the borders of the visible area. Workaround: Class CustomDragDropService Inherits TreeViewDragDropService Public Sub New(ByVal owner As RadTreeViewElement) MyBase.New(owner) End Sub Protected Overrides Sub SetHintWindowPosition(ByVal mousePt As Point) End Sub End Class Class CustomTreeViewElement Inherits RadTreeViewElement Protected Overrides ReadOnly Property ThemeEffectiveType As Type Get Return GetType(RadTreeViewElement) End Get End Property Protected Overrides Function CreateDragDropService() As TreeViewDragDropService Return New CustomDragDropService(Me) End Function End Class Class CustomTreeView Inherits RadTreeView Protected Overrides Function CreateTreeViewElement() As RadTreeViewElement Return New CustomTreeViewElement() End Function Public Overrides Property ThemeClassName As String Get Return GetType(RadTreeView).FullName End Get Set(value As String) MyBase.ThemeClassName = value End Set End Property End Class
To reproduce: please refer to the attached project. Workaround: if you access the RadTreeNode.TreeViewElement property, the TreeView property is loaded.
Workaround: call the ExpandAll method of the tree removing any nodes
When you start dragging a node you will notice that the drag hint is constantly flickering.
To reproduce: DataTable dt = new DataTable(); public Form1() { InitializeComponent(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("ParentID", typeof(int)); dt.Columns.Add("NodeName", typeof(string)); dt.Rows.Add(1, 0, "Category1"); dt.Rows.Add(2, 1, "Category2"); dt.Rows.Add(3, 0, "Category3"); dt.Rows.Add(4, 3, "Category4"); dt.Rows.Add(5, 3, "Category5"); dt.Rows.Add(6, 3, "Category6"); dt.Rows.Add(7, 6, "Category7"); dt.Rows.Add(8, 6, "Category8"); this.radTreeView1.DataSource = dt; this.radTreeView1.DisplayMember = "NodeName"; this.radTreeView1.ChildMember = "ID"; this.radTreeView1.ParentMember = "ParentID"; this.radTreeView1.ExpandAll(); this.radTreeView1.AllowAdd = true; this.radTreeView1.AllowRemove = true; this.radTreeView1.AllowDefaultContextMenu = true; this.radLabel1.Text = "Number of rows: " + dt.Rows.Count; this.radTreeView1.NodeRemoved += radTreeView1_NodeRemoved; } private void radTreeView1_NodeRemoved(object sender, Telerik.WinControls.UI.RadTreeViewEventArgs e) { this.radLabel1.Text = "Number of rows: " + dt.Rows.Count; } Workaround: perform the delete operation programmatically by modifying the default context menu: this.radTreeView1.ContextMenuOpening += radTreeView1_ContextMenuOpening; private void radTreeView1_ContextMenuOpening(object sender, TreeViewContextMenuOpeningEventArgs e) { foreach (RadMenuItem item in e.Menu.Items) { if (item.Text == "&Delete") { item.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; } else { item.Visibility = Telerik.WinControls.ElementVisibility.Visible; } } RadMenuItem removeItem = new RadMenuItem("Remove"); e.Menu.Items.Add(removeItem); removeItem.Click += item_Click; } private void item_Click(object sender, EventArgs e) { DeleteSubNodes(this.radTreeView1.SelectedNode); this.radLabel1.Text = "Number of rows: " + dt.Rows.Count; } private void DeleteSubNodes(Telerik.WinControls.UI.RadTreeNode node) { if (node.Nodes.Count == 0) { dt.Rows.Remove(((DataRowView)node.DataBoundItem).Row); } else { foreach (RadTreeNode n in node.Nodes) { DeleteSubNodes(n); } dt.Rows.Remove(((DataRowView)node.DataBoundItem).Row); } }
To reproduce: - add a RadTreeView - enable multiselect - select at least 1 node - call radTreeView1.SelectedNodes.Clear() Workaround: Clear the nodes manually: foreach (var node in this.radTreeView1.SelectedNodes.ToList()) { node.Selected = false; }
How to reproduce: check the attached project Workaround: create a custom TreeViewDragDropService class CustomTreeViewElement : RadTreeViewElement { protected override Type ThemeEffectiveType { get { return typeof(RadTreeViewElement); } } protected override TreeViewDragDropService CreateDragDropService() { return new CustomDragDropService(this); } } class CustomTreeView : RadTreeView { protected override RadTreeViewElement CreateTreeViewElement() { return new CustomTreeViewElement(); } public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } } } class CustomDragDropService : TreeViewDragDropService { public CustomDragDropService(RadTreeViewElement owner) : base(owner) { } protected override bool CancelPreviewDragDrop(RadDropEventArgs e) { return false; } }
To reproduce: public RadForm1() { InitializeComponent(); for (int i = 0; i < 10; i++) { this.radTreeView1.Nodes.Add("Node1." + i); } this.radTreeView1.AllowDragDrop = true; this.radTreeView1.TreeViewElement.DragDropService.PreviewDragDrop+=DragDropService_PreviewDragDrop; } private void DragDropService_PreviewDragDrop(object sender, RadDropEventArgs e) { e.Handled = true; }
To reproduce: for (int i = 0; i < 10; i++) { this.radTreeView1.Nodes.Add("Node1." + i); } this.radTreeView1.AllowDragDrop = true; this.radTreeView1.TreeViewElement.DragDropService.ShowDragHint = false; Workaround: this.radTreeView1.TreeViewElement.DragDropService.PreviewDragHint += DragDropService_PreviewDragHint; private void DragDropService_PreviewDragHint(object sender, PreviewDragHintEventArgs e) { e.UseDefaultHint = false; }
To reproduce: please refer to the attached gif file. Workaround: insteda of hiding the expander by the ShowExpandCollapse property use the NodeFormatting event as follows: private void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { e.NodeElement.ExpanderElement.Visibility = ElementVisibility.Collapsed; }
Pressing arrow down or up when renaming item on a list with scrollbar throws null pointer exception. Example solution in attachement. Steps to reproduce with attached solution: Scroll down to last element (A99) Press F2 (rename) and rename to "0" Press arrow up or down on a keyboard (without pressing enter after rename). -> NullReferenceException is thrown.
To reproduce: this.radTreeView1.TriStateMode = true; RadTreeNode sitesNode = radTreeView1.Nodes.Add("Sites", "Sites", ""); sitesNode.Expanded = true; RadTreeNode siteNode = new RadTreeNode("A site"); sitesNode.Nodes.Add(siteNode); RadTreeNode eNode = new RadTreeNode("Event Types"); siteNode.Nodes.Add(eNode); siteNode.Expanded = true; RadTreeNode dummy = new RadTreeNode("dummy"); eNode.Nodes.Add(dummy); dummy.CheckState = ToggleState.On; RadTreeNode dummy2 = new RadTreeNode("dummy2"); eNode.Nodes.Add(dummy2); dummy2.CheckState = ToggleState.Off; Please refer to the attached screenshot. Workaround: change the CheckState property after all nodes are added to RadTreeView. this.radTreeView1.TriStateMode = true; RadTreeNode sitesNode = radTreeView1.Nodes.Add("Sites", "Sites", ""); sitesNode.Expanded = true; RadTreeNode siteNode = new RadTreeNode("A site"); sitesNode.Nodes.Add(siteNode); RadTreeNode eNode = new RadTreeNode("Event Types"); siteNode.Nodes.Add(eNode); siteNode.Expanded = true; RadTreeNode dummy = new RadTreeNode("dummy"); eNode.Nodes.Add(dummy); RadTreeNode dummy2 = new RadTreeNode("dummy2"); eNode.Nodes.Add(dummy2); dummy2.CheckState = ToggleState.Off; dummy.CheckState = ToggleState.On;
Please refer to the attached gif files illustrating the working and non working design time data binding.
To reproduce: Add a RadTreeView and a RadBreadCrumb and two RadButtons on the form and populate the tree view with data. Use the following code snippet: private void radButton1_Click(object sender, EventArgs e) { this.radBreadCrumb1.DefaultTreeView = null; } Random rand = new Random(); private void radButton2_Click(object sender, EventArgs e) { this.radTreeView1.DataSource = null; DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("Name"); for (int i = 0; i < 10; i++) { dt.Rows.Add(rand.Next(0, 20), "Node" + i); } this.radTreeView1.DataSource = dt; this.radTreeView1.DisplayMember = "Name"; this.radTreeView1.ValueMember = "Id"; this.radBreadCrumb1.DefaultTreeView = this.radTreeView1; } Select some node in RadTreeView, the RadBreadCrum is updated respectively. Then click the first button to detach RadTreeView from RadBreadCrumb. Click the second button to populate RadTreeView with new data and associated the RadBreadCrumb with RadTreeView again. As a result you will notice that the last selected node will be loaded. Workaround: clear the selection in RadTreeView before associating the RadBreadCrumb with RadTreeView: this.radTreeView1.ClearSelection(); this.radBreadCrumb1.DefaultTreeView = this.radTreeView1;
To reproduce: 1. Add a RadTreeView and a RadBreadCrumb. Associated the breadcrumb with the tree. 2. Select a node and use the following code: this.radBreadCrumb1.DefaultTreeView.Nodes.Clear(); Workaround: set the RadBreadCrumb.DefaultTreeView property to null.
Steps to reproduce: 1. Add RadTreeView with few items 2. Apply custom filtering 3. In order to remove the custom filtering and return the default filtering, set the FilterPredicate to null. As a result, it is thrown an exception. Workaround: 1. Save the default filter predicate before applying the custom filtering 2. Clear filter descriptors and set the FilterPredicate property to stored default filter predicate In the attachments can be found a sample application demonstrating the issue and the workaround