Hi,
I am trying to create a RadGridView with a child template, I based my code this example : http://demos.telerik.com/silverlight/#GridView/Hierarchy/HierarchyChildTemplate
But on top of this I wanted to have a number of dynamic columns at the top level and also at the child template level. However when I set the XAML AutoGenerateColumns attribute to True it does not interpret the column with the data for the child template, it just processes it as a regular field value.
I am using the DataTable objects to store the dynamic property values.
What do I need to do to get WPF to process the "LowerLevel" property into the ChildTemplate?
(FYI: I am consuming an XML file hence the need for dynamic columns, below is a simplified example of what I am trying to do)
Thanks for your help!
John
I am trying to create a RadGridView with a child template, I based my code this example : http://demos.telerik.com/silverlight/#GridView/Hierarchy/HierarchyChildTemplate
But on top of this I wanted to have a number of dynamic columns at the top level and also at the child template level. However when I set the XAML AutoGenerateColumns attribute to True it does not interpret the column with the data for the child template, it just processes it as a regular field value.
I am using the DataTable objects to store the dynamic property values.
What do I need to do to get WPF to process the "LowerLevel" property into the ChildTemplate?
(FYI: I am consuming an XML file hence the need for dynamic columns, below is a simplified example of what I am trying to do)
Thanks for your help!
John
<
Window
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
x:Class
=
"WpfRadGridViewCustomHierarchyDynamicColumns.MainWindow"
Title
=
"MainWindow"
Height
=
"350"
Width
=
"525"
Loaded
=
"Window_Loaded"
>
<
Grid
>
<
telerik:RadGridView
x:Name
=
"DynamicGridUi"
ShowColumnFooters
=
"True"
GroupRenderMode
=
"Flat"
CanUserFreezeColumns
=
"False"
ColumnWidth
=
"*"
GridLinesVisibility
=
"Both"
RowIndicatorVisibility
=
"Collapsed"
IsReadOnly
=
"True"
AutoGenerateColumns
=
"True"
>
<
telerik:RadGridView.ChildTableDefinitions
>
<
telerik:GridViewTableDefinition
/>
</
telerik:RadGridView.ChildTableDefinitions
>
<
telerik:RadGridView.Columns
>
</
telerik:RadGridView.Columns
>
<
telerik:RadGridView.HierarchyChildTemplate
>
<
DataTemplate
>
<
telerik:RadGridView
x:Name
=
"RadGridView1"
GroupRenderMode
=
"Flat"
BorderThickness
=
"0,1,0,1"
GridLinesVisibility
=
"None"
CanUserFreezeColumns
=
"False"
AutoGenerateColumns
=
"False"
ItemsSource
=
"{Binding LowerLevel}"
ShowGroupPanel
=
"True"
IsReadOnly
=
"True"
>
<
telerik:RadGridView.Columns
>
</
telerik:RadGridView.Columns
>
</
telerik:RadGridView
>
</
DataTemplate
>
</
telerik:RadGridView.HierarchyChildTemplate
>
</
telerik:RadGridView
>
</
Grid
>
</
Window
>
using
System;
using
System.Collections.Generic;
using
System.Data;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Data;
using
System.Windows.Documents;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Imaging;
using
System.Windows.Navigation;
using
System.Windows.Shapes;
namespace
WpfRadGridViewCustomHierarchyDynamicColumns
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public
partial
class
MainWindow : Window
{
public
MainWindow()
{
InitializeComponent();
}
private
void
Window_Loaded(
object
sender, RoutedEventArgs e)
{
Random gen =
new
Random();
DataTable dtTopLevel =
new
DataTable();
// Define the top level columns
dtTopLevel.Columns.Add(
"KnownCol"
,
typeof
(
string
));
// Generate dynamic column names for top level
List<
string
> DynamicColumns =
new
List<
string
>();
int
intColCount = gen.Next(1, 6);
for
(
int
i = 0; i < intColCount; i++)
{
DynamicColumns.Add(
"Col"
+ i);
}
// Add those dynamic columns to the top level
foreach
(
string
strItem
in
DynamicColumns)
{
dtTopLevel.Columns.Add(strItem,
typeof
(
string
));
}
// DataTable for child template
dtTopLevel.Columns.Add(
"LowerLevel"
,
typeof
(DataTable));
string
[] RowDataForKnownColumn =
new
string
[] {
"1st"
,
"2nd"
,
"3rd"
,
"4th"
,
"5th"
,
"6th"
};
foreach
(
string
item
in
RowDataForKnownColumn)
{
// Add cell value for known column
var aryStart =
new
object
[] { item };
// Generate dynamic columns cell values
List<
string
> listCellValuesForRow =
new
List<
string
>();
foreach
(
string
strColumnName
in
DynamicColumns)
{
listCellValuesForRow.Add(
"Val"
+ item +
","
+ strColumnName);
}
// Data for Child Template
DataTable dtLowerLevel =
new
DataTable();
// Define the columns for the lower level data for each row
foreach
(
string
strColumnName
in
DynamicColumns)
{
dtLowerLevel.Columns.Add(strColumnName,
typeof
(
string
));
}
// Then generate and add the cell data for the lower level table
for
(
int
i = 0; i < gen.Next(1, RowDataForKnownColumn.Length); i++)
// generate a random number of rows for the lower
{
List<
string
> listLowerLevelCellValues =
new
List<
string
>();
foreach
(
string
strColumnName
in
DynamicColumns)
{
// Generate the cell contents for the the row in the lower table
listLowerLevelCellValues.Add(
"LowerVal "
+ RowDataForKnownColumn[i] +
","
+ strColumnName);
}
// Add the cell values for the current row in the lower table
dtLowerLevel.Rows.Add(listLowerLevelCellValues.ToArray());
}
// End data for child template
// Include the cell values for the dynamic columns for this row
var aryMiddle = listCellValuesForRow.ToArray();
// Include the the data table value which contains the row values for the lower level
var aryEnd =
new
object
[] { dtLowerLevel };
// Concatenate all the row values into a single array
var aryRowValues = aryStart.Concat(aryMiddle).ToArray().Concat(aryEnd).ToArray();
// Add all the cell values for this row in the top level
dtTopLevel.Rows.Add(aryRowValues);
}
DynamicGridUi.ItemsSource = dtTopLevel;
}
}
}