Hi.
I'm facing and issue with displaying hierarchical data (self-referencing) in grid when missing parent items in data source - only part of data is displayed.
1. Add grid to form
1.var grid = new RadGridView {Dock = DockStyle.Fill};2.this.Controls.Add(grid);3.grid.Columns.Add("cName","Name","Name"); //Dummy column displaying Name
2. Setup self-referencing
1.var col1 = new GridViewTextBoxColumn("hiddenColumnId", "Id");2.var col2 = new GridViewTextBoxColumn("hiddenColumnParentId", "ParentId");3.grid.MasterTemplate.Columns.Add(col1);4.grid.MasterTemplate.Columns.Add(col2);5.grid.Columns["hiddenColumnId"].IsVisible = false;6.grid.Columns["hiddenColumnParentId"].IsVisible = false;7.grid.Relations.AddSelfReference(grid.MasterTemplate, "hiddenColumnId", "hiddenColumnParentId");
3. Create dummy data type
01.class Item02.{03. public Item(int id, string name, int? parentId = null)04. {05. Id = id;06. Name = name;07. ParentId = parentId;08. }09. 10. public int Id { get; set; }11. public string Name { get; set; }12. public int? ParentId { get; set; }13.}
4. Add new data source
01.var items = new List<Item>02.{03. new Item(1,"1"),04. new Item(2,"1.1",1),05. new Item(3,"1.2",1),06. new Item(7,"1.2.1",3),07. new Item(4,"2"),08. new Item(5,"2.1",4),09. new Item(6,"2.2",4)10.};11.grid.DataSource = items;
And as expected a correct tree structure is displayed
1.12.-1.13.-1.24.--1.2.15.26.-2.17.-2.2
However in my case due to busines logic I have only a subset of data - all except item "1" and "2".
Instead of ex
1.1.12.1.23.-1.2.14.2.15.2.2
I can see only children of first missing parent item. Although the number of rows is matching correct total number of item to be displayed (5) only part of items are visible (3).
1.1.12.1.23.-1.2.1
As a workaroud I can modify data source and remove parent assignement from objects if parent is missing in data source either on data preparation or DataBindingComplete event.
01.private void Grid_DataBindingComplete(object sender, GridViewBindingCompleteEventArgs e)02. {03. var grid = sender as RadGridView;04. 05. // Get existing items06. var ids = new List<object>();07. foreach (var id in grid.Columns["hiddenColumnId"].DistinctValues)08. {09. ids.Add(id);10. }11. 12. // Remove missing parents13. foreach (var row in grid.Rows)14. {15. var parentId = row.Cells["hiddenColumnParentId"].Value;16. if (!ids.Contains(parentId))17. row.Cells["hiddenColumnParentId"].Value = null;18. }19.}
However this solution is not suitable, because it is modifying data providing inconsistant state - using that data in code I may falsly assume that the item does not have a parent while it has.
Any ideas how to solve this issue?
Regargs
Greg
