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
Item
02.
{
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.
1
2.
-1.1
3.
-1.2
4.
--1.2.1
5.
2
6.
-2.1
7.
-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.1
2.
1.2
3.
-1.2.1
4.
2.1
5.
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.1
2.
1.2
3.
-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 items
06.
var ids =
new
List<
object
>();
07.
foreach
(var id
in
grid.Columns[
"hiddenColumnId"
].DistinctValues)
08.
{
09.
ids.Add(id);
10.
}
11.
12.
// Remove missing parents
13.
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