This is a migrated thread and some comments may be shown as answers.

RadGridVew with “Custom Hierarchy Template” and dynamic columns

1 Answer 245 Views
GridView
This is a migrated thread and some comments may be shown as answers.
John
Top achievements
Rank 1
John asked on 07 Mar 2013, 12:42 PM
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

<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;
        }
    }
}




1 Answer, 1 is accepted

Sort by
0
Vlad
Telerik team
answered on 12 Mar 2013, 07:28 AM
Hi,

 You can use the Loaded event of the child grid to access the child grid itself  (sender argument in the event handler). 

Greetings,
Vlad
the Telerik team

Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

Tags
GridView
Asked by
John
Top achievements
Rank 1
Answers by
Vlad
Telerik team
Share this question
or