I am using the RADGridView for the manipulation of data, the data has a number of "week" blocks which consist of 3 columns, i have been using columngroups to create a header for each week block. The number of week blocks, and therefore columns in the grid, is variable so a dynamic object is used at the item source and the columns generated in the "AutoGeneratingColumn" event, as are the column groups. The issue is that not all the column groups are being displayed once the grid has been generated, i have checked the properties of the group to check each column has its correct column group and it does.
See the code below (it's a cut down version of the actual code but it produces the same result)
Code behind
See the code below (it's a cut down version of the actual code but it produces the same result)
<Window x:Class="ColumnGroupsExample.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="dtMainResource"> <TextBlock Text="{Binding Path=MainResourceType}" /> </DataTemplate> <DataTemplate x:Key="dtAdjustedCost"> <TextBlock Text="{Binding Path=AdjustedCost, StringFormat=C}" HorizontalAlignment="Right" Padding="0,0,4,0" /> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> </Grid.RowDefinitions> <telerik:RadGridView Grid.Row="0" CanUserDeleteRows="False" CanUserInsertRows="False" CanUserSortColumns="False" ShowGroupPanel="False" AutoGeneratingColumn="RadGridView_AutoGeneratingColumn" ItemsSource="{Binding Rows}" RowIndicatorVisibility="Collapsed" AlternateRowBackground="White" AlternationCount="2" Background="AliceBlue" EditTriggers="None" HorizontalGridLinesBrush="SlateGray" SelectionMode="Single" SelectionUnit="FullRow" ShowColumnHeaders="True" IsFilteringAllowed="False" VerticalGridLinesBrush="Transparent" FrozenColumnCount="1"> <telerik:RadGridView.ColumnGroups> <telerik:GridViewColumnGroup Name="Type" Header="Type" /> <telerik:GridViewColumnGroup Name="Monthly" Header="Monthly" /> </telerik:RadGridView.ColumnGroups> </telerik:RadGridView> </Grid> </Window> Code behind
namespace ColumnGroupsExample { using System; using System.Collections.Generic; using System.Linq; using System.Text; 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; using Telerik.Windows.Data; using Telerik.Windows.Controls; /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private ViewModel _viewModel; public MainWindow() { InitializeComponent(); _viewModel = new ViewModel(); this.DataContext = _viewModel; } private void RadGridView_AutoGeneratingColumn(object sender, Telerik.Windows.Controls.GridViewAutoGeneratingColumnEventArgs e) { if (e.Column.UniqueName.Contains("Week")) { if (e.Column.UniqueName.EndsWith("CostPlan")) { DataTemplate costPlanDT = new DataTemplate(); FrameworkElementFactory spCostPlan = new FrameworkElementFactory(typeof(DockPanel)); spCostPlan.SetValue(DockPanel.LastChildFillProperty, false); FrameworkElementFactory costPlanEntry = new FrameworkElementFactory(typeof(TextBox)); costPlanEntry.SetBinding(TextBox.TextProperty, new Binding(e.Column.UniqueName) { NotifyOnSourceUpdated = true, UpdateSourceTrigger = UpdateSourceTrigger.LostFocus, StringFormat = "F2" }); costPlanEntry.SetValue(TextBox.FontSizeProperty, 10.0); costPlanEntry.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Right); costPlanEntry.SetValue(TextBox.WidthProperty, 80D); spCostPlan.AppendChild(costPlanEntry); costPlanDT.VisualTree = spCostPlan; costPlanDT.Seal(); e.Column.Header = "Cost Plan"; e.Column.CellTemplate = costPlanDT; e.Column.Width = 88; int weekNumber = System.Convert.ToInt32(e.Column.UniqueName.Replace("Week", "").Replace("CostPlan", "")); ((RadGridView)sender).ColumnGroups.Add(new GridViewColumnGroup() { Name = e.Column.UniqueName.Replace("CostPlan", ""), Header = string.Format("Week : {0} - {1}", weekNumber, DateTime.Now.AddDays((weekNumber - 1) * 7).ToString("dd/MM/yyyy")) }); e.Column.ColumnGroupName = e.Column.UniqueName.Replace("CostPlan", ""); } else if (e.Column.UniqueName.EndsWith("AssessedCost")) { DataTemplate assessedCostDT = new DataTemplate(); FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(DockPanel)); spFactory.SetValue(DockPanel.LastChildFillProperty, false); FrameworkElementFactory assessedCostsEntry = new FrameworkElementFactory(typeof(TextBox)); assessedCostsEntry.SetBinding(TextBox.TextProperty, new Binding(e.Column.UniqueName) { NotifyOnSourceUpdated = true, UpdateSourceTrigger = UpdateSourceTrigger.LostFocus, StringFormat = "F2" }); assessedCostsEntry.SetValue(TextBox.FontSizeProperty, 10.0); assessedCostsEntry.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Right); assessedCostsEntry.SetValue(TextBox.WidthProperty, 80D); spFactory.AppendChild(assessedCostsEntry); assessedCostDT.VisualTree = spFactory; assessedCostDT.Seal(); e.Column.Header = "Assessed Cost"; e.Column.CellTemplate = assessedCostDT; e.Column.Width = 88; e.Column.ColumnGroupName = e.Column.UniqueName.Replace("AssessedCost", ""); } else if (e.Column.UniqueName.EndsWith("Difference")) { DataTemplate differenceDt = new DataTemplate(); FrameworkElementFactory difference = new FrameworkElementFactory(typeof(TextBlock)); difference.SetBinding(TextBlock.TextProperty, new Binding(e.Column.UniqueName) { StringFormat = "C" }); difference.SetValue(TextBlock.FontSizeProperty, 10.0); difference.SetValue(TextBlock.PaddingProperty, new Thickness(0, 0, 4, 0)); difference.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Right); difference.SetValue(TextBlock.WidthProperty, 80D); differenceDt.VisualTree = difference; differenceDt.Seal(); e.Column.Header = "Difference"; e.Column.CellTemplate = differenceDt; e.Column.ColumnGroupName = e.Column.UniqueName.Replace("Difference", ""); } else if (e.Column.UniqueName.EndsWith("CF03DetailDateUid")) { //Don't show this column e.Column.IsVisible = false; } } else { if (e.Column.UniqueName == "MainResourceType") { e.Column.CellTemplate = (DataTemplate)this.Resources["dtMainResource"]; e.Column.Header = "Resource Type"; e.Column.ColumnGroupName = "Type"; } else if (e.Column.UniqueName == "Projection") { DataTemplate projectionDT = new DataTemplate(); FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(DockPanel)); spFactory.SetValue(DockPanel.LastChildFillProperty, false); FrameworkElementFactory projectionEntry = new FrameworkElementFactory(typeof(TextBox)); projectionEntry.SetBinding(TextBox.TextProperty, new Binding(e.Column.UniqueName) { NotifyOnSourceUpdated = true, UpdateSourceTrigger = UpdateSourceTrigger.LostFocus, StringFormat = "F2" }); projectionEntry.SetValue(TextBox.FontSizeProperty, 10.0); ; projectionEntry.SetValue(TextBox.StyleProperty, (Style)this.Resources["detailEntry"]); projectionEntry.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Right); projectionEntry.SetValue(TextBox.WidthProperty, 80D); spFactory.AppendChild(projectionEntry); projectionDT.VisualTree = spFactory; projectionDT.Seal(); e.Column.CellTemplate = projectionDT; e.Column.Header = "Projection"; e.Column.ColumnGroupName = "Monthly"; } else if (e.Column.UniqueName == "AdjustedCost") { //#FFCCFFFF e.Column.CellTemplate = (DataTemplate)this.Resources["dtAdjustedCost"]; e.Column.Header = "Adjusted Costs"; e.Column.ColumnGroupName = "Monthly"; } } } } }View Model
namespace ColumnGroupsExample { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Dynamic; using System.Collections.ObjectModel; using System.Windows.Input; public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private ObservableCollection<dynamic> _rows; /// <summary> /// /// </summary> /// <param name="name"></param> protected void OnPropertyChanged(string name) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(name)); } } public ViewModel() { _rows = new ObservableCollection<dynamic>(); CreateRow("Staff"); CreateRow("Labour"); CreateRow("Plant"); CreateRow("Temp Materials"); CreateRow("Perm Materials"); CreateRow("Sub Contract"); } public void CreateRow(string type) { var row = new ExpandoObject() as IDictionary<string, Object>; decimal zero = 0; Guid? blankUid = Guid.Empty; row.Add("MainResourceType", type); row.Add("AdjustedCost", zero); row.Add("Projection", zero); for (int i = 1; i <= 13; i++) { row.Add(string.Format("Week{0}CostPlan", i), zero); row.Add(string.Format("Week{0}AssessedCost", i), zero); row.Add(string.Format("Week{0}Difference", i), zero); row.Add(string.Format("Week{0}CF03DetailDateUid", i), blankUid); } _rows.Add(row); } public ObservableCollection<dynamic> Rows { get { return _rows; } set { if (_rows != value) { _rows = value; OnPropertyChanged("Rows"); } } } } }
Please advise on how to get the column groups displaying correctly.
Cheers
Steve