This question is locked. New answers and comments are not allowed.
I am trying to have a RadGridView save its sorting descriptors and pass them on to a new RadGridView. I need this functionality, because when a user refreshes a view, the previous RadGridView is destroyed and a new one is created. This new view may have different data (depending on the user's actions), but we wish to have the old RadGridView's filters and sorts carried over to the new RadGridView.
So far, I have managed to have the filters persist across the two RadGridViews, and I have managed to have the sorts persist when there are no filters on the grid. However, if there is both a filter on the grid and a sort (not even in the same column), only the filter persists. The sort is ignored. Please see the pictures for more details.
My code that saves the filter and sort descriptors is as follows:
And here's the code that applies these saved filters and sorts to the new RadGridView inside its Loaded event:
Please let me know what I may be missing or doing wrong. It would be nice to have both filters and sorts persist when creating a new RadGridView instead of one or the other as it is now. Thanks.
So far, I have managed to have the filters persist across the two RadGridViews, and I have managed to have the sorts persist when there are no filters on the grid. However, if there is both a filter on the grid and a sort (not even in the same column), only the filter persists. The sort is ignored. Please see the pictures for more details.
My code that saves the filter and sort descriptors is as follows:
List<FilterSetting> filterSettings = new List<FilterSetting>();foreach (IColumnFilterDescriptor columnFilter in RadGridView.FilterDescriptors){ FilterSetting columnFilterSetting = new FilterSetting(); columnFilterSetting.ColumnUniqueName = columnFilter.Column.UniqueName; columnFilterSetting.SelectedDistinctValues.AddRange(columnFilter.DistinctFilter.DistinctValues); if (columnFilter.FieldFilter.Filter1.IsActive) { columnFilterSetting.Filter1 = new FilterDescriptorProxy(); columnFilterSetting.Filter1.Operator = columnFilter.FieldFilter.Filter1.Operator; columnFilterSetting.Filter1.Value = columnFilter.FieldFilter.Filter1.Value; columnFilterSetting.Filter1.IsCaseSensitive = columnFilter.FieldFilter.Filter1.IsCaseSensitive; } columnFilterSetting.FieldFilterLogicalOperator = columnFilter.FieldFilter.LogicalOperator; if (columnFilter.FieldFilter.Filter2.IsActive) { columnFilterSetting.Filter2 = new FilterDescriptorProxy(); columnFilterSetting.Filter2.Operator = columnFilter.FieldFilter.Filter2.Operator; columnFilterSetting.Filter2.Value = columnFilter.FieldFilter.Filter2.Value; columnFilterSetting.Filter2.IsCaseSensitive = columnFilter.FieldFilter.Filter2.IsCaseSensitive; } filterSettings.Add(columnFilterSetting);}List<SortSetting> sortSettings = new List<SortSetting>();foreach (ColumnSortDescriptor columnSort in RadGridView.SortDescriptors){ SortSetting columnSortSetting = new SortSetting(); columnSortSetting.ColumnUniqueName = columnSort.Column.UniqueName; columnSortSetting.Direction = columnSort.SortDirection; sortSettings.Add(columnSortSetting);}RunTimeData = new RunTimeData(){ SelectedTags = this.SelectedTags, GridFilters = filterSettings, GridSorts = sortSettings};And here's the code that applies these saved filters and sorts to the new RadGridView inside its Loaded event:
if (RunTimeData != null && this._dataTable.Rows.Count > 0){ this.SelectedTags = RunTimeData.SelectedTags; RadGridView.FilterDescriptors.SuspendNotifications(); RadGridView.SortDescriptors.SuspendNotifications(); foreach (var c in RadGridView.Columns) { if (c.ColumnFilterDescriptor.IsActive) c.ClearFilters(); } foreach (FilterSetting setting in RunTimeData.GridFilters) { SynColumn column = (SynColumn)RadGridView.Columns[setting.ColumnUniqueName]; if (column != null) { Telerik.Windows.Controls.GridView.IColumnFilterDescriptor columnFilter = column.ColumnFilterDescriptor; foreach (object distinctValue in setting.SelectedDistinctValues) columnFilter.DistinctFilter.AddDistinctValue(distinctValue); if (setting.Filter1 != null) { columnFilter.FieldFilter.Filter1.Operator = setting.Filter1.Operator; columnFilter.FieldFilter.Filter1.Value = setting.Filter1.Value; columnFilter.FieldFilter.Filter1.IsCaseSensitive = setting.Filter1.IsCaseSensitive; } columnFilter.FieldFilter.LogicalOperator = setting.FieldFilterLogicalOperator; if (setting.Filter2 != null) { columnFilter.FieldFilter.Filter2.Operator = setting.Filter2.Operator; columnFilter.FieldFilter.Filter2.Value = setting.Filter2.Value; columnFilter.FieldFilter.Filter2.IsCaseSensitive = setting.Filter2.IsCaseSensitive; } } } foreach (SortSetting setting in RunTimeData.GridSorts) { ColumnSortDescriptor columnSort = new ColumnSortDescriptor(); columnSort.SortDirection = setting.Direction; columnSort.Column = RadGridView.Columns[setting.ColumnUniqueName]; RadGridView.SortDescriptors.Add(columnSort); } RadGridView.FilterDescriptors.ResumeNotifications(); RadGridView.SortDescriptors.ResumeNotifications(); RunTimeData = null;}Please let me know what I may be missing or doing wrong. It would be nice to have both filters and sorts persist when creating a new RadGridView instead of one or the other as it is now. Thanks.