New to Telerik UI for WPFStart a free 30-day trial

Save and Load Filter Settings

Updated on Sep 24, 2025

To save and load column filters, you would have to create a simple property bag class that will hold all relevant information.

C#
	public class FilterDescriptorProxy
	{
	    public Telerik.Windows.Data.FilterOperator Operator { get; set; }
	    public object Value { get; set; }
	    public bool IsCaseSensitive { get; set; }
	}
	
	public class FilterSetting
	{
	    public string ColumnUniqueName { get; set; }
	    public List<object> SelectedDistinctValues = new List<object>();
	    public FilterDescriptorProxy Filter1 { get; set; }
	    public Telerik.Windows.Data.FilterCompositionLogicalOperator FieldFilterLogicalOperator { get; set; }
	    public FilterDescriptorProxy Filter2 { get; set; }
	}

To save the settings you need to read the current filtering information from RadGridView and store it in a collection of these property bag objects. You can then take this collection and serialize it to a medium of your choice a database or an XML file, for example, by using RadPersistenceFramework.

C#
	public static IEnumerable<FilterSetting> SaveColumnFilters(Telerik.Windows.Controls.GridView.GridViewDataControl grid)
	{
	    IList<FilterSetting> settings = new List<FilterSetting>();
	
	    foreach (Telerik.Windows.Data.IFilterDescriptor filter in grid.FilterDescriptors)
	    {
	        Telerik.Windows.Controls.GridView.IColumnFilterDescriptor columnFilter = filter as Telerik.Windows.Controls.GridView.IColumnFilterDescriptor;
	        if (columnFilter != null)
	        {
	            FilterSetting setting = new FilterSetting();
	
	            setting.ColumnUniqueName = columnFilter.Column.UniqueName;
	
	            setting.SelectedDistinctValues.AddRange(columnFilter.DistinctFilter.DistinctValues);
	
	            if (columnFilter.FieldFilter.Filter1.IsActive)
	            {
	                setting.Filter1 = new FilterDescriptorProxy();
	                setting.Filter1.Operator = columnFilter.FieldFilter.Filter1.Operator;
	                setting.Filter1.Value = columnFilter.FieldFilter.Filter1.Value;
	                setting.Filter1.IsCaseSensitive = columnFilter.FieldFilter.Filter1.IsCaseSensitive;
	            }
	
	            setting.FieldFilterLogicalOperator = columnFilter.FieldFilter.LogicalOperator;
	
	            if (columnFilter.FieldFilter.Filter2.IsActive)
	            {
	                setting.Filter2 = new FilterDescriptorProxy();
	                setting.Filter2.Operator = columnFilter.FieldFilter.Filter2.Operator;
	                setting.Filter2.Value = columnFilter.FieldFilter.Filter2.Value;
	                setting.Filter2.IsCaseSensitive = columnFilter.FieldFilter.Filter2.IsCaseSensitive;
	            }
	
	            settings.Add(setting);
	        }
	    }
	
	    return settings;
	}
	
	public static void LoadColumnFilters(Telerik.Windows.Controls.GridView.GridViewDataControl grid
	    , IEnumerable<FilterSetting> savedSettings)
	{
	    grid.FilterDescriptors.SuspendNotifications();
	
	    foreach (FilterSetting setting in savedSettings)
	    {
	        Telerik.Windows.Controls.GridViewColumn column = grid.Columns[setting.ColumnUniqueName];
	
	        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;
	        }
	    }
	
	    grid.FilterDescriptors.ResumeNotifications();
	}

Note that when the filters are being restored we suspend and resume the notifications in order to perform the filtering in a single batch.

When you deserialize the filter settings, you only need to find the respective column and apply the information stored in the property bag to the column filter.

C#
	private IEnumerable<FilterSetting> serializedSettings;
	
	private void OnSaveButtonClick(object sender, RoutedEventArgs e)
	{
	    IEnumerable<FilterSetting> savedSettings = SaveColumnFilters(this.radGridView);
	
	    // You can serialize the saved settings in any way that you like from here on.
	    this.serializedSettings = savedSettings;
	}
	
	private void OnLoadButtonClick(object sender, RoutedEventArgs e)
	{
	    // You should deserialize the settings from where you have serialized them.
	    IEnumerable<FilterSetting> savedSettings = this.serializedSettings;
	
	    LoadColumnFilters(this.radGridView, savedSettings);
	}

More about this you can learn here.

You can also check the Save and Load Settings for RadGridView article.

Not finding the help you need?
Contact Support