To reproduces: add a RadTreeView and set up Object-relational hierarchy. Use the following code: NorthwindEntities context = new NorthwindEntities(); public Form1() { InitializeComponent(); context.Categories.Load(); context.Products.Load(); this.radTreeView1.DataSource = context.Categories.Local.ToBindingList(); this.radTreeView1.DisplayMember = "CategoryName\\ProductName"; this.radTreeView1.ChildMember = "Categories\\Products"; } private void radButton1_Click(object sender, EventArgs e) { this.radTreeView1.ChildMember = "Products\\Categories"; this.radTreeView1.DisplayMember = "ProductName\\CategoryName"; this.radTreeView1.DataSource = context.Products.Local.ToBindingList(); } When you click the RadButton, NullReferenceException occurs. Resolution: Add more descriptive exception message.
Workaround: use the NodeFormatting event to set the NodeElement.ExpanderElement.Padding to new Padding(1, 0, 0, 0)
To reproduce: 1.Add a RadTreeView and four RadButton controls. 2.Use the following code snippet: private Random random = new Random(); public Form1() { InitializeComponent(); radTreeView1.AutoSize = true; radTreeView1.TreeViewElement.HorizontalScrollState = ScrollState.AlwaysHide ; radTreeView1.TreeViewElement.DrawBorder = false; } private string NextText() { char[] letters = new char[random.Next(4, 11)]; for (int i = 0; i < letters.Length; ++i) { letters[i] = (char)random.Next('a', 'z' + 1); } letters[0] = char.ToUpper(letters[0]); return new string(letters); } private RadTreeNodeCollection GetRandomNodeCollection() { if (radTreeView1.Nodes.Count == 0) { return radTreeView1.Nodes; } int depth = random.Next(MaxDepth(radTreeView1.Nodes)); var source = radTreeView1.Nodes; while ((depth--) >= 0 && source.Count > 0) { source = source[random.Next(source.Count)].Nodes; } return source; } private static int MaxDepth(RadTreeNodeCollection nodes, int currentDepth = 0) { if (nodes.Count == 0) { return currentDepth; } int max = -1; foreach (var n in nodes) { max = Math.Max(MaxDepth(n.Nodes, currentDepth + 1), max); } return max; } private void UpdateTree(bool clearNodes) { radTreeView1.BeginUpdate(); if (clearNodes) { radTreeView1.Nodes.Clear(); } else { bool makeRoot = false; int count = random.Next(10, 50); for (; count > 0; --count) { makeRoot = random.NextDouble() < 0.23456789; var nodes = makeRoot ? radTreeView1.Nodes : GetRandomNodeCollection(); nodes.Add(NextText()); } } radTreeView1.EndUpdate(); radTreeView1.ExpandAll(); } private void radButton1_Click(object sender, EventArgs e) { UpdateTree(false); } private void radButton2_Click(object sender, EventArgs e) { UpdateTree(true); } private void radButton3_Click(object sender, EventArgs e) { radTreeView1.ExpandAll(); } private void radButton4_Click(object sender, EventArgs e) { radTreeView1.CollapseAll(); } Workaround: instead of clearing nodes, remove one by one: //radTreeView1.Nodes.Clear(); while (radTreeView1.Nodes.Count > 0) { radTreeView1.Nodes.Last().Remove(); }
To reproduce use the following function to reset the data source of the treeview public void LoadObjects() { radBreadCrumb1.DefaultTreeView = null; tvObjects.DataSource = null; tvObjects.DataSource = GetTable(); tvObjects.DisplayMember = "Name"; tvObjects.ValueMember = "Name"; radBreadCrumb1.DefaultTreeView = tvObjects; } Workaround: public void LoadObjects() { radBreadCrumb1.DefaultTreeView = null; MethodInfo mi = typeof(RadBreadCrumb).GetMethod("value_Selected", BindingFlags.Instance | BindingFlags.NonPublic); Delegate delegateToRemove = Delegate.CreateDelegate(typeof(RadTreeView.RadTreeViewEventHandler), this.radBreadCrumb1, mi); this.tvObjects.TreeViewElement.SelectedNodeChanged -= (RadTreeView.RadTreeViewEventHandler)delegateToRemove; mi = typeof(RadBreadCrumb).GetMethod("value_NodeExpand", BindingFlags.Instance | BindingFlags.NonPublic); delegateToRemove = Delegate.CreateDelegate(typeof(RadTreeView.TreeViewEventHandler), this.radBreadCrumb1, mi); this.tvObjects.TreeViewElement.NodeExpandedChanged -= (RadTreeView.TreeViewEventHandler)delegateToRemove; tvObjects.DataSource = null; tvObjects.DataSource = GetTable(); tvObjects.DisplayMember = "Name"; tvObjects.ValueMember = "Name"; radBreadCrumb1.DefaultTreeView = tvObjects; }
To reproduce: add a hierarchical RadTreeView with several levels. Use the RadTreeNode.Expanded property in order to expand a child node from the bottom levels. Ensure that all parent nodes up to the top are expanded as well. When you run the application, the vertical scroll bar is not displayed. Sub New() InitializeComponent() Me.Size = New Size(234, 188) Dim dt As New DataTable dt.Columns.Add("Id", GetType(String)) dt.Columns.Add("ParentId", GetType(String)) dt.Columns.Add("Name", GetType(String)) Dim uniqueId As String = Guid.NewGuid().ToString() dt.Rows.Add(uniqueId, Nothing, "Node.1") For index = 2 To 5 Dim subUniqueId As String = Guid.NewGuid().ToString() dt.Rows.Add(subUniqueId, uniqueId, "SubNode.1." & index) If index Mod 2 = 0 Then For index2 = 6 * index To 6 * index + 5 Dim subSubUniqueId As String = Guid.NewGuid().ToString() dt.Rows.Add(subSubUniqueId, subUniqueId, "SubSubNode.1." & index & "." & index2) For index3 = 12 * index To 12 * index + 3 Dim subSubSubUniqueId As String = Guid.NewGuid().ToString() dt.Rows.Add(subSubSubUniqueId, subSubUniqueId, "SubSubSubNode.1." & index & "." & index2 & "." & index3) Next Next End If Next Me.RadTreeView1.DataSource = dt Me.RadTreeView1.DisplayMember = "Name" Me.RadTreeView1.ValueMember = "Id" Me.RadTreeView1.RelationBindings.Add(New RelationBinding(dt, "Name", "ParentId", "Id", "Id")) End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim nodeTextToExpand = "SubSubNode.1.4.27" Dim nodeToExpand = Me.RadTreeView1.GetNodeByName(nodeTextToExpand) If nodeToExpand IsNot Nothing Then Expand(nodeToExpand) End If End Sub Private Sub Expand(nodeToExpand As RadTreeNode) nodeToExpand.Expanded = True If nodeToExpand.Parent IsNot Nothing Then Expand(nodeToExpand.Parent) End If End Sub Workaround: start expanding the nodes from the top most level to the bottom most level: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim nodeTextToExpand = "SubSubNode.1.4.27" Dim nodeToExpand = Me.RadTreeView1.GetNodeByName(nodeTextToExpand) If nodeToExpand IsNot Nothing Then Expand(nodeToExpand) End If While (nodes.Count > 0) nodes.Pop().Expanded = True End While End Sub Dim nodes As New Stack(Of RadTreeNode) Private Sub Expand(nodeToExpand As RadTreeNode) nodes.Push(nodeToExpand) If nodeToExpand.Parent IsNot Nothing Then Expand(nodeToExpand.Parent) End If End Sub
it appears to work okay on android, but I can't use it from an ipad
To reproduce: Add some notes to RadTreeView. Set the Font as follows in the NodeFormatting event: Font font = new Font("Tahoma", 13f); void tree_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { e.NodeElement.ContentElement.Font = font; } Start the project on Windows 7 or Vista with ClearType off and you will see that the font is thick. Workaround: Use the following node element: public class MyTreeNodeElement : TreeNodeElement { protected override TreeNodeContentElement CreateContentElement() { return new MyTreeNodeContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } public class MyTreeNodeContentElement : TreeNodeContentElement { protected override void PrePaintElement(Telerik.WinControls.Paint.IGraphics graphics) { base.PrePaintElement(graphics); Graphics g = graphics.UnderlayGraphics as Graphics; if (g == null) { return; } if (this.Enabled) { g.TextRenderingHint = this.TextRenderingHint; } else { g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; } } } void tree_CreateNodeElement(object sender, CreateTreeNodeElementEventArgs e) { e.NodeElement = new MyTreeNodeElement(); } And set the TextRenderingHint of the ContentElement: Font font = new Font("Tahoma", 13f); void tree_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { e.NodeElement.ContentElement.Font = font; e.NodeElement.ContentElement.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; }
To reproduce : add a RadTreeView with several nodes and use the following code snippet: this.radTreeView1.AllowDragDrop = true; this.TopMost = true; Note that dragging a node will no longer display the "DropHint" line. Workaround: class CustomDragDropService : TreeViewDragDropService { public CustomDragDropService(RadTreeViewElement owner) : base(owner) { } protected override void UpdateHintPosition(Point mousePosition) { FieldInfo fi = typeof(TreeViewDragDropService).GetField("dropHintWindow", BindingFlags.NonPublic | BindingFlags.Instance); RadLayeredWindow window = fi.GetValue(this) as RadLayeredWindow; window.TopMost = true; base.UpdateHintPosition(mousePosition); } } class CustomTreeViewElement : RadTreeViewElement { //Enable themeing for the element protected override Type ThemeEffectiveType { get { return typeof(RadTreeViewElement); } } //Replace the default drag drop service with the custom one protected override TreeViewDragDropService CreateDragDropService() { return new CustomDragDropService(this); } } 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; } } }
The disabling of the scroll bars is broke as shit. I have tried rtvDrainage.HorizontalScroll.Visible = false; rtvDrainage.HorizontalScroll.Maximum = 0; rtvDrainage.HorizontalScroll.Enabled = false; rtvDrainage.AutoScroll = false; rtvDrainage.EnableDeferredScrolling = false; rtvDrainage.EnableKineticScrolling = false; rtvDrainage.HScrollBar.Maximum = 0; rtvDrainage.HScrollBar.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; NOTHING stops this damn thing from showing up (i put this in both the load and in a button to hit after loading) 2 hours wasted trying to make a scroll bar not show up.........
Add a RadTreeView with several hierarchy levels. Initially all nodes are collapsed. When you collapse each child node deeper in the hierarchy, use the following code snippet: public Form1() { InitializeComponent(); radTreeView1.CollapseAll(); radTreeView1.TreeViewElement.AutoScrollOnClick = false; } private void radTreeView1_NodeExpandedChanged(object sender, RadTreeViewEventArgs e) { if (e.Node.Expanded) { e.Node.LastNode.EnsureVisible(); radTreeView1.BringIntoView(e.Node.LastNode); } } The last child node is visible, regarding the height, however, the entire node is not visible, regarding the width. Workaround: use RadTreeView.MouseUp event instead. private void radTreeView1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { TreeNodeExpanderItem expander = radTreeView1.ElementTree.GetElementAtPoint(e.Location) as TreeNodeExpanderItem; if (expander != null && expander.Expanded && expander.NodeElement.Data != null) { radTreeView1.BringIntoView(expander.NodeElement.Data.LastNode); } } }
To reproduce: protected override void OnLoad(EventArgs e) { base.OnLoad(e); radTreeView1 = new RadTreeView(); radTreeView1.Parent = this; for (int i = 0; i < 5; i++) { RadTreeNode n1 = new RadTreeNode("Node" + i); this.radTreeView1.Nodes.Add(n1); if (i % 2 == 0) { for (int j = 0; j < 2; j++) { RadTreeNode n2 = new RadTreeNode("Node" + i + "." + j); n1.Nodes.Add(n2); if (j % 2 == 0) { for (int k = 0; k < 2; k++) { RadTreeNode n3 = new RadTreeNode("Node" + i + "." + j + "." + k); n2.Nodes.Add(n3); } } } } } radTreeView1.ShowRootLines = true; radTreeView1.ShowExpandCollapse = false; radTreeView1.ShowLines = true; } WORKAROUND: void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { if (radTreeView1.ShowExpandCollapse == false && radTreeView1.ShowRootLines == true) { if (e.Node.Parent == null && e.Node.Nodes.Count >0) { TreeNodeLineElement lineElement = (TreeNodeLineElement)e.NodeElement.LinesContainerElement.Children[0]; lineElement.Visibility = ElementVisibility.Visible; if (e.Node.Index==0) { lineElement.Type = TreeNodeLineElement.LinkType.RightTopAngleShape; } else if (e.Node.Index == radTreeView1.Nodes.Count -1) { lineElement.Type = TreeNodeLineElement.LinkType.RightBottomAngleShape; } } } }
To reproduce: Add nodes to RadTreeView with at least 3 levels hierarchy. Set some of the last level nodes Visible property to false. Start the application. Expand some nodes and scroll. You will notice that the last item will change sometimes. Workaround: Set this.radTreeView1.TreeViewElement.AllowArbitraryItemHeight = true; Use ItemHeight = 1, instead of Visible = false
To reproduce use this code: RadTreeView tree = new RadTreeView(); tree.Name = "tree"; RadTreeNode[] nodes = new RadTreeNode[5]; for (int i = 0; i < nodes.Length; ++i) nodes[i] = new RadTreeNode(i.ToString()); tree.Nodes.AddRange(nodes); tree.Nodes.Clear(); tree.Nodes.AddRange(nodes);
To reproduce: void radTreeView1_EditorInitialized(object sender, TreeNodeEditorInitializedEventArgs e) { TreeViewTextBoxEditor editor = e.Editor as TreeViewTextBoxEditor; BaseTextBoxEditorElement element = (BaseTextBoxEditorElement)editor.EditorElement; element.TextChanging+=new TextChangingEventHandler(element_TextChanging); } void element_TextChanging(object sender, TextChangingEventArgs e) { e.Cancel = true; }
FIX. RadTreeView - updating a field in the DataBoundItem of a node is not automatically reflected
Please refer to the attached gif files illustrating the working and non working design time data binding.
To reproduce: - populate a tree with some nodes in different levels - set the ShowLines to true - select a node on the second level - clear the nodes on a button click => exception is thrown WORKAROUND: radTreeView1.ShowLines = false; radTreeView1.Nodes.Clear(); radTreeView1.ShowLines = true;
Workaround: this.radTreeView1.SelectedNode = null;
RadTreeView arrow keys navigation is not correct in RTL mode. It should expand with left key and collapse with right key (the opposite of normal mode)
FIX. RadTreeView throws exception when node text is changed to empty string in bound mode