To reproduce: public Form1() { InitializeComponent(); for (int i = 0; i < 20; i++) { this.radTreeView1.Nodes.Add("Node"+i); } this.radTreeView1.AllowEdit = true; } The attached gif file illustrates the steps. Workaround: this.radTreeView1.VScrollBar.ValueChanged+=VScrollBar_ValueChanged; private void VScrollBar_ValueChanged(object sender, EventArgs e) { this.radTreeView1.EndEdit(); }
To reproduce: radTreeView1.CheckBoxes = true; radTreeView1.TriStateMode = true; radTreeView1.AutoCheckChildNodes = true; RadTreeNode root = radTreeView1.Nodes.Add("Home"); root.Expanded = true; RadTreeNode node1 = new RadTreeNode("Minimal"); node1.CheckState = Telerik.WinControls.Enumerations.ToggleState.On; root.Nodes.Add(node1); Workaround: first add the node to the Nodes collection and only then set its CheckState
To reproduce: - Add items to the tree view (scrollbar must appear) - Add context menu item which adds a new node and puts it in edit mode. - Add a new node with the context menu item, scroll to the bottom, add item again. - Scroll up and add item one more time. Workaround: void treeView_EditorRequired(object sender, TreeNodeEditorRequiredEventArgs e) { e.Editor = new TreeViewTextBoxEditor(); }
To reproduce: - Add a lot of nodes to the tree (scrollbars must appear). - Use the following code to add nodes: public RadForm1() { InitializeComponent(); radTreeView1.AllowEdit = true; RadContextMenu menu = new RadContextMenu(); RadMenuItem add = new RadMenuItem(); add.Click += add_Click; add.Text = "add"; menu.Items.Add(add); radTreeView1.RadContextMenu = menu; } void add_Click(object sender, EventArgs e) { RadTreeNode node = radTreeView1.SelectedNode; var newNode = node.Nodes.Add("new node"); node.Expanded = true; radTreeView1.SelectedNode = newNode; radTreeView1.BeginEdit(); } - Add a node and scroll Workaround: public RadForm1() { InitializeComponent(); radTreeView1.TreeViewElement.VScrollBar.Scroll += VScrollBar_Scroll; radTreeView1.MouseWheel += TreeViewElement_MouseWheel; } void TreeViewElement_MouseWheel(object sender, MouseEventArgs e) { var radTreeView = sender as RadTreeView; if (radTreeView.IsEditing) { radTreeView.EndEdit(); } } void VScrollBar_Scroll(object sender, ScrollEventArgs e) { var radTreeView = (sender as RadScrollBarElement).ElementTree.Control as RadTreeView; if (radTreeView.IsEditing) { radTreeView.EndEdit(); } }
To reproduce: private void radTreeView1_NodesNeeded(object sender, Telerik.WinControls.UI.NodesNeededEventArgs e) { for (int i = 0; i < 100; i++) { var node = new RadTreeNode("Test"+i); for (int j = 0; j < 10; j++) { node.Nodes.Add(new RadTreeNode("Sub")); } node.Expanded = true; e.Nodes.Add(node); } } Workaorund: private void radTreeView1_NodesNeeded(object sender, Telerik.WinControls.UI.NodesNeededEventArgs e) { radTreeView1.BeginUpdate(); for (int i = 0; i < 100; i++) { var node = new RadTreeNode("Test"+i); for (int j = 0; j < 10; j++) { node.Nodes.Add(new RadTreeNode("Sub")); } node.Expanded = true; e.Nodes.Add(node); } radTreeView1.EndUpdate(); }
Workaround: create a custom TreeNodeContentElement and override the Synchronize method public class MyTreeNodeContentElement : TreeNodeContentElement { protected override Type ThemeEffectiveType { get { return typeof(TreeNodeContentElement); } } public override void Synchronize() { TreeNodeElement treeNodeElement = NodeElement; if (treeNodeElement == null || treeNodeElement.Data == null || treeNodeElement.Data.TreeViewElement == null || treeNodeElement.Data.Text == null) { return; } this.Text = treeNodeElement.Data.Text; } } public class MyTreeNodeElement : TreeNodeElement { protected override TreeNodeContentElement CreateContentElement() { return new MyTreeNodeContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } public partial class Form1 : Form { public Form1() { InitializeComponent(); this.radTreeView1.AllowEdit = true; this.radTreeView1.DisplayMember = "name"; this.radTreeView1.ParentMember = "pid"; this.radTreeView1.ChildMember = "id"; this.radTreeView1.DataSource = this.GetSampleData(); this.radTreeView1.CreateNodeElement += radTreeView1_CreateNodeElement; this.radTreeView1.ValueChanged += radTreeView1_ValueChanged; } private void radTreeView1_CreateNodeElement(object sender, Telerik.WinControls.UI.CreateTreeNodeElementEventArgs e) { e.NodeElement = new MyTreeNodeElement(); } private void radTreeView1_ValueChanged(object sender, Telerik.WinControls.UI.TreeNodeValueChangedEventArgs e) { this.UpdateDb(); } private void UpdateDb() { this.radTreeView1.DataSource = null; DataTable dt = this.GetSampleData(); this.radTreeView1.DataSource = dt; } private DataTable GetSampleData() { DataTable dt = new DataTable(); DataColumn dc = new DataColumn(); dc.ColumnName = "id"; dc.DataType = typeof(int); dt.Columns.Add(dc); DataColumn dc1 = new DataColumn(); dc1.ColumnName = "name"; dc1.DataType = typeof(string); dt.Columns.Add(dc1); DataColumn dc2 = new DataColumn(); dc2.ColumnName = "pid"; dc2.DataType = typeof(int); dt.Columns.Add(dc2); DataRow dr = dt.NewRow(); dr[0] = 0; dr[1] = "My Computer"; dr[2] = DBNull.Value; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 1; dr[1] = @"C:\"; dr[2] = 0; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 2; dr[1] = @"D:\"; dr[2] = 0; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 3; dr[1] = "Program Files"; dr[2] = 1; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 4; dr[1] = "Microsoft"; dr[2] = 3; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 5; dr[1] = "Telerik"; dr[2] = 3; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 6; dr[1] = "WINDOWS"; dr[2] = 1; dt.Rows.Add(dr); return dt; } }
To reproduce: use the attached sample project and follow the steps: 1. Filter by "Jo". 2. Press the "Refresh" button. 3. Press the "Clear Filter" button. Note: if there is no applied filter when rebinding, the nodes order is correct. Please refer to the attached gif file. Workaround: clear the filter before setting the DataSource property and restore ethe filter afterwards: string filter = this.radTreeView1.Filter + ""; this.radTreeView1.Filter = ""; this.radTreeView1.DataSource = dt; this.radTreeView1.DisplayMember = "Name"; this.radTreeView1.ValueMember = "Id"; this.radTreeView1.Filter = filter;
To reproduce: public BlankTreeView() { InitializeComponent(); RadContextMenu menu = new RadContextMenu(); RadMenuItem addItem = new RadMenuItem("Add"); addItem.Click += addItem_Click; menu.Items.Add(addItem); this.radTreeView1.RadContextMenu = menu; BindingList<ParentObject> items = new BindingList<ParentObject>(); for (int i = 0; i < 3; i++) { BindingList<ChildObject> subItems = new BindingList<ChildObject>(); for (int j = 0; j < 10; j++) { subItems.Add(new ChildObject(j,"SubNode" + i + "." + j)); } items.Add(new ParentObject(i ,"Node" + i,subItems)); } this.radTreeView1.DataSource = items; this.radTreeView1.DisplayMember = "Title\\Description"; this.radTreeView1.ChildMember = "ParentObject\\Children"; } private void addItem_Click(object sender, EventArgs e) { if (this.radTreeView1.SelectedNode != null) { if (this.radTreeView1.SelectedNode.Level == 0) { Random rand = new Random(); ParentObject dataItem = this.radTreeView1.SelectedNode.DataBoundItem as ParentObject; if (dataItem != null) { dataItem.Children.Add(new ChildObject(rand.Next(0, 100),"New Node")); } } } } public class ParentObject: INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private int id; private string title; private BindingList<ChildObject> children; public int ID { get { return this.id; } set { this.id = value; OnPropertyChanged("ID"); } } public string Title { get { return this.title; } set { this.title = value; OnPropertyChanged("Title"); } } public BindingList<ChildObject> Children { get { return this.children; } set { this.children = value; OnPropertyChanged("Children"); } } public ParentObject(int iD, string title, BindingList<ChildObject> children) { this.ID = iD; this.Title = title; this.Children = children; } } public class ChildObject: INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private int id; private string description; public int ID { get { return this.id; } set { this.id = value; OnPropertyChanged("ID"); } } public string Description { get { return this.description; } set { this.description = value; OnPropertyChanged("Description"); } } public ChildObject(int iD, string description) { this.id = iD; this.description = description; } protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } Workaround: reset the TreeViewElement after adding the record: radTreeView1.TreeViewElement.Update(RadTreeViewElement.UpdateActions.Reset);
To reproduce: public Form1() { InitializeComponent(); this.radTreeView1.NodesNeeded+=radTreeView1_NodesNeeded; } private void radTreeView1_NodesNeeded(object sender, Telerik.WinControls.UI.NodesNeededEventArgs e) { Console.WriteLine("NodesNeeded"); } As a result StackOverFlowException is thrown. Workaround: Do not subscribe to the NodesNeeded event if the LazyMode property is set to false.
When you open the last node for edit programmatically, either an exception is thrown or the editor is not opened. Steps to reproduce: 1. Drag a RadTreeView from Toolbox and drop it onto the form. 2. Set the size of RadTreeView at design time to Size(354, 248). 3. Add a RadButton. 4. Use the following code: public Form1() { InitializeComponent(); radTreeView1.AllowEdit = true; radTreeView1.Nodes.Add("Root"); for (int i = 0; i < 20; i++) { radTreeView1.Nodes[0].Nodes.Add("Test" + i.ToString()); } } private void radButton1_Click(object sender, EventArgs e) { RadTreeNode node = new RadTreeNode("Demo" + radTreeView1.Nodes[0].Nodes.Count.ToString()); radTreeView1.Nodes[0].Nodes.Add(node); node.BeginEdit(); } 5. Click the button. 6. Collapse the root node. 7. Click the button again. Workaround: private void button1_Click(object sender, EventArgs e) { RadTreeNode node = new RadTreeNode("Demo" + radTreeView1.Nodes[0].Nodes.Count.ToString()); radTreeView1.Nodes[0].Nodes.Add(node); this.radTreeView1.TreeViewElement.Update(RadTreeViewElement.UpdateActions.Reset); node.Parent.Expanded = true; ((MyTreeViewElement)this.radTreeView1.TreeViewElement).SuspendEndEdit = true; node.BeginEdit(); ((MyTreeViewElement)this.radTreeView1.TreeViewElement).SuspendEndEdit = false; } public class MyTreeView : RadTreeView { protected override RadTreeViewElement CreateTreeViewElement() { return new MyTreeViewElement(); } public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } set { } } } public class MyTreeViewElement : RadTreeViewElement { public bool SuspendEndEdit = false; protected override Type ThemeEffectiveType { get { return typeof(RadTreeViewElement); } } protected override bool EndEditCore(bool commitChanges) { if (SuspendEndEdit) { return false; } return base.EndEditCore(commitChanges); } }
To reproduce: 1) Create a Windows Forms project. 2) Add a RadTreeView control. 3) Set the KeyboardSearchEnabled property to true. 4) Run the application and click in the tree (just to make sure it has the focus). 5) Using the keyboard, press a letter key. 6) Minimize the application. The same exception occurs if there are no selected nodes. Workaround: class MyTreeView : RadTreeView { protected override RadTreeViewElement CreateTreeViewElement() { return new MyTreeViewElement(); } public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } set { base.ThemeClassName = value; } } } class MyTreeViewElement : RadTreeViewElement { protected override Type ThemeEffectiveType { get { return typeof(RadTreeViewElement); } } protected override RadTreeNode GetFirstMatch(string searchCriteria, RadTreeNodeCollection nodes) { if(this.SelectedNode == null && this.Items == null) { return null; } return base.GetFirstMatch(searchCriteria, nodes); } }
To reproduce: - Open the attached project. - Scroll to the right. - Drag a node. - The DropHint line is outside the window. 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); } } //Replace the default drag drop service with the custom one protected override TreeViewDragDropService CreateDragDropService() { return new MyDragDropService(this); } } class MyDragDropService : TreeViewDragDropService { public MyDragDropService(RadTreeViewElement owner) : base(owner) { } protected override void UpdateHintPosition(Point mousePosition) { base.UpdateHintPosition(mousePosition); RadLayeredWindow dropHint =typeof(TreeViewDragDropService).GetField("dropHintWindow", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this) as RadLayeredWindow; if (dropHint != null) { TreeNodeElement nodeElement = this.DropTarget as TreeNodeElement; dropHint.Location = new Point (nodeElement.ElementTree.Control.PointToScreen(Point.Empty).X, dropHint.Location.Y); } } }
Workaround: this.radTreeView1.TreeViewElement.InvalidateMeasure(); this.radTreeView1.TreeViewElement.InvalidateArrange();
To reproduce: select a node and click the button. Note: it may be necessary to perform this several times. public partial class Form1 : Form { public Form1() { InitializeComponent(); } private List<DataObject> GetDataList() { var ret = new List<DataObject>(); ret.Add(new DataObject() { Node = "A", Parent = null }); ret.Add(new DataObject() { Node = "B", Parent = "A" }); ret.Add(new DataObject() { Node = "C", Parent = "B" }); ret.Add(new DataObject() { Node = "D", Parent = "B" }); return ret; } private void button1_Click(object sender, EventArgs e) { radTreeView1.Nodes.Clear(); radTreeView1.DisplayMember = "Node"; radTreeView1.ChildMember = "Node"; radTreeView1.ParentMember = "Parent"; radTreeView1.DataSource = GetDataList(); radTreeView1.ExpandAll(); } } public class DataObject { public string Node { get; set; } public string Parent { get; set; } } Workaround: instead of clearing the nodes, set the DataSource property to null.
Use the attached project to reproduce. - Check on of the nodes and then press Alt +T (do not move the mouse away from the node) Workaround: Set transparent fill and border to the TreeNodeElement disabled state in Visual Style Builder.
Please refer to the attached sample project and follow the steps: If you execute my code sample and try this sequence, you will see my problem: 1- start the application 2- select "test1" on the grid => you see "fonction XX of test1" in the treeview (that's correct) 3- select "test2" on the grid => you see "fonction XX of test2" in the treeview (that's correct) 4- expand all nodes in the treeview 5- uncheck "fonction 31 of test2" in the treeview 6- select "test1" on the grid => you have the error message. On the grid, we have "test1" selected and on the treeview we have "test2". Note that the problem appears only when checking a node in the treeview on a second level. If you follow this procedure, you will have no problem : 1- restart the application 2- select "test1" on the grid => you see "fonction XX of test1" in the treeview (that's correct) 3- select "test2" on the grid => you see "fonction XX of test2" in the treeview (that's correct) 4- uncheck "fonction 30 of test2" in the treeview 5- select "test1" on the grid => you will have no error. On the grid, we have "test1" selected and on the treeview we have "test1". 6- select "test2" on the grid => you will have no error. On the grid, we have "test2" selected and on the treeview we have "test2" with "fonction 30 of test2" unchecked. Workaround: in order to synchronize the current row in RadGridView is to change the RadTreeView.DataSource in the RadGridView.CurrentRowChanged event.
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.
Please refer to the attached screenshot from the Demo application >> General Settings example. Workaround: private void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { e.NodeElement.ExpanderElement.Margin = new Padding(2, 0, 0, 0); }
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: 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; }