How to add filter in WinForms GridControl?
There is no built-in support for having a filter bar in a GridControl, because the GridFilterBar uses DataView’s RowFilter property for filtering.
If you are using the GridControl in virtual mode with a data table then the filter bar function can be implemented. In the given sample, the GridControlFilterBar is created to enable filter bar in grid control.
Creating the GridControlFilterBar:
C#
public class GridControlFilterBar { private GridControl _grid; private DataView filterView; private DataView originalView; public int RowCount; public int FilterRowIndex = 1; //Wire the Grid with the filterbar public void WireGrid(GridControl grid, DataTable dt) { this._grid = grid; this.originalView = dt.DefaultView; this.filterView = new DataView(dt); RowCount = dt.Rows.Count + 1; _grid.Model.Rows.FrozenCount += 1; if(this._grid != null) { this._grid.CurrentCellAcceptedChanges += new CancelEventHandler(_grid_CurrentCellAcceptedChanges); this._grid.CurrentCellCloseDropDown += new Syncfusion.Windows.Forms.PopupClosedEventHandler(_grid_CurrentCellCloseDropDown); this._grid.QueryCellInfo += new GridQueryCellInfoEventHandler(_grid_QueryCellInfo); _grid.Refresh(); } } bool inUnwire = false; //Unwire the Grid from the filter public void UnwireGrid() { this._grid.CurrentCellAcceptedChanges -= new CancelEventHandler(_grid_CurrentCellAcceptedChanges); this._grid.CurrentCellCloseDropDown -= new Syncfusion.Windows.Forms.PopupClosedEventHandler(_grid_CurrentCellCloseDropDown); this._grid.QueryCellInfo -= new GridQueryCellInfoEventHandler(_grid_QueryCellInfo); originalView.RowFilter = ""; this.RowCount = originalView.Table.Rows.Count; _grid.Model.Rows.FrozenCount -= 1; inUnwire = true; for(int i = 1;i<_grid.ColCount;i++) _grid[FilterRowIndex,i].Text =""; _grid.Refresh(); this._grid = null; inUnwire = false; } //Return the Grid is wired or not. public bool IsWired { get{return (this._grid!= null)&&!inUnwire;} } //Data table for creating a unique entries protected virtual DataTable CreateUniqueEntries(string colName) { DataRow row1; DataTable table1 = new DataTable(colName); table1.Columns.Add(new DataColumn(colName)); row1 = table1.NewRow(); row1[0] = "[None]"; table1.Rows.Add(row1); string text1 = ""; ArrayList tempArray = new ArrayList(); filterView.Sort = colName +" ASC"; for (int num1 = 0; num1 < filterView.Count; num1++) { text1 = filterView[num1].Row[colName].ToString(); if(tempArray.Count==0 || !tempArray.Contains(text1)) { row1 = table1.NewRow(); row1[0] = text1; tempArray.Add(text1); table1.Rows.Add(row1); } } return table1; } //Filter collection ArrayList filters = new ArrayList(); struct filter { public string colname,filterString; public filter(string colname, string filterString) { this.colname = colname; this.filterString = filterString; } } //Setting the filter condition public void SetFilters() { string FilterString = ""; foreach(filter fil in filters) { if(filters.IndexOf(fil)>0) FilterString += " AND "; FilterString += "["+fil.colname+"] = "+fil.filterString; } originalView.RowFilter = FilterString; RowCount = originalView.Count+1; _grid.Refresh(); } }
VB
Public Class GridControlFilterBar Private _grid As GridControl Private filterView As DataView Private originalView As DataView Public RowCount As Integer Public FilterRowIndex As Integer = 1 'Wire the Grid with the filterbar Public Sub WireGrid(ByVal grid As GridControl, ByVal dt As DataTable) Me._grid = grid Me.originalView = dt.DefaultView Me.filterView = New DataView(dt) RowCount = dt.Rows.Count + 1 _grid.Model.Rows.FrozenCount += 1 If Me._grid IsNot Nothing Then AddHandler _grid.CurrentCellAcceptedChanges, AddressOf _grid_CurrentCellAcceptedChanges AddHandler _grid.CurrentCellCloseDropDown, AddressOf _grid_CurrentCellCloseDropDown AddHandler _grid.QueryCellInfo, AddressOf _grid_QueryCellInfo _grid.Refresh() End If End Sub Private inUnwire As Boolean = False 'Unwire the Grid from the filter Public Sub UnwireGrid() RemoveHandler _grid.CurrentCellAcceptedChanges, AddressOf _grid_CurrentCellAcceptedChanges RemoveHandler _grid.CurrentCellCloseDropDown, AddressOf _grid_CurrentCellCloseDropDown RemoveHandler _grid.QueryCellInfo, AddressOf _grid_QueryCellInfo originalView.RowFilter = "" Me.RowCount = originalView.Table.Rows.Count _grid.Model.Rows.FrozenCount -= 1 inUnwire = True For i As Integer = 1 To _grid.ColCount - 1 _grid(FilterRowIndex,i).Text ="" Next i _grid.Refresh() Me._grid = Nothing inUnwire = False End Sub 'Return the Grid is wired or not. Public ReadOnly Property IsWired() As Boolean Get Return (Me._grid IsNot Nothing) AndAlso Not inUnwire End Get End Property 'Data table for creating a unique entries Protected Overridable Function CreateUniqueEntries(ByVal colName As String) As DataTable Dim row1 As DataRow Dim table1 As New DataTable(colName) table1.Columns.Add(New DataColumn(colName)) row1 = table1.NewRow() row1(0) = "[None]" table1.Rows.Add(row1) Dim text1 As String = "" Dim tempArray As New ArrayList() filterView.Sort = colName &" ASC" For num1 As Integer = 0 To filterView.Count - 1 text1 = filterView(num1).Row(colName).ToString() If tempArray.Count=0 OrElse (Not tempArray.Contains(text1)) Then row1 = table1.NewRow() row1(0) = text1 tempArray.Add(text1) table1.Rows.Add(row1) End If Next num1 Return table1 End Function 'Filter collection Private filters As New ArrayList() Private Structure filter Public colname, filterString As String Public Sub New(ByVal colname As String, ByVal filterString As String) Me.colname = colname Me.filterString = filterString End Sub End Structure 'Setting the filter condition Public Sub SetFilters() Dim FilterString As String = "" For Each fil As filter In filters If filters.IndexOf(fil)>0 Then FilterString &= " AND " End If FilterString &= "[" & fil.colname &"] = " & fil.filterString Next fil originalView.RowFilter = FilterString RowCount = originalView.Count+1 _grid.Refresh() End Sub End Class
Event Handlers for the GridControlFilterBar:
C#
private void _grid_CurrentCellAcceptedChanges(object sender, CancelEventArgs e) { GridCurrentCell cc = this._grid.CurrentCell; if(cc.ColIndex>0 && cc.RowIndex ==1) { foreach(filter fil in filters) { if(fil.colname == originalView.Table.Columns[cc.ColIndex - 1].ColumnName) { filters.Remove(fil); break; } } if(cc.Renderer.StyleInfo.Text != "[None]") filters.Add(new filter(originalView.Table.Columns[cc.ColIndex - 1].ColumnName,"'" + cc.Renderer.StyleInfo.Text + "'")); SetFilters(); } } private void _grid_CurrentCellCloseDropDown(object sender, Syncfusion.Windows.Forms.PopupClosedEventArgs e) { GridCurrentCell cc = this._grid.CurrentCell; if(cc.ColIndex>0 && cc.RowIndex ==1) cc.ConfirmChanges(); } private void _grid_QueryCellInfo(object sender, GridQueryCellInfoEventArgs e) { if(e.ColIndex>0 && e.RowIndex == FilterRowIndex) { e.Style.CellType = GridCellTypeName.ComboBox; e.Style.ExclusiveChoiceList = true; e.Style.DataSource = CreateUniqueEntries(originalView.Table.Columns[e.ColIndex - 1].ColumnName); e.Style.ValueMember = originalView.Table.Columns[e.ColIndex - 1].ColumnName; } }
VB
Private Sub _grid_CurrentCellAcceptedChanges(ByVal sender As Object, ByVal e As CancelEventArgs) Dim cc As GridCurrentCell = Me._grid.CurrentCell If cc.ColIndex>0 AndAlso cc.RowIndex =1 Then For Each fil As filter In filters If fil.colname = originalView.Table.Columns(cc.ColIndex - 1).ColumnName Then filters.Remove(fil) Exit For End If Next fil If cc.Renderer.StyleInfo.Text <> "[None]" Then filters.Add(New filter(originalView.Table.Columns(cc.ColIndex - 1).ColumnName,"'" & cc.Renderer.StyleInfo.Text & "'")) End If SetFilters() End If End Sub Private Sub _grid_CurrentCellCloseDropDown(ByVal sender As Object, ByVal e As Syncfusion.Windows.Forms.PopupClosedEventArgs) Dim cc As GridCurrentCell = Me._grid.CurrentCell If cc.ColIndex>0 AndAlso cc.RowIndex =1 Then cc.ConfirmChanges() End If End Sub Private Sub _grid_QueryCellInfo(ByVal sender As Object, ByVal e As GridQueryCellInfoEventArgs) If e.ColIndex>0 AndAlso e.RowIndex = FilterRowIndex Then e.Style.CellType = GridCellTypeName.ComboBox e.Style.ExclusiveChoiceList = True e.Style.DataSource = CreateUniqueEntries(originalView.Table.Columns(e.ColIndex - 1).ColumnName) e.Style.ValueMember = originalView.Table.Columns(e.ColIndex - 1).ColumnName End If End Sub
Wiring the Grid with the GridControlFilterBar:
C#
GridControlFilterBar filterBar; private void Form1_Load(object sender, System.EventArgs e) { //Creating the object for GridControlFilterBar filterBar = new GridControlFilterBar(); filterBar.WireGrid(this.gridControl1,this.dt); //Hook the event to wire/unwire the grid from filter this.btnWire.Click += btnWire_Click; } void btnWire_Click(object sender, EventArgs e) { //Wire/unwire the Grid from the filter bar if (this.filterBar.IsWired) this.filterBar.UnwireGrid(); else this.filterBar.WireGrid(this.gridControl1, this.dt); }
VB
Private filterBar As GridControlFilterBar Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) 'Creating the object for GridControlFilterBar filterBar = New GridControlFilterBar() filterBar.WireGrid(Me.gridControl1,Me.dt) 'Hook the event to wire/unwire the grid from filter AddHandler Me.btnWire.Click, AddressOf btnWire_Click End Sub Private Sub btnWire_Click(ByVal sender As Object, ByVal e As EventArgs) 'Wire/unwire the Grid from the filter bar If Me.filterBar.IsWired Then Me.filterBar.UnwireGrid() Else Me.filterBar.WireGrid(Me.gridControl1, Me.dt) End If End Sub
I hope you enjoyed learning about how to add filter in WinForms GridControl.
You can refer to our WinForms GridControl feature tour page to know about its other groundbreaking feature representations and documentation, and how to quickly get started for configuration specifications. You can also explore our WinForms GridControl example to understand how to create and manipulate data.
For current customers, you can check out our components from the License and Downloads page. If you are new to Syncfusion, you can try our 30-day free trial to check out our other controls.
If you have any queries or require clarifications, please let us know in the comments section below. You can also contact us through our support forums, Direct-Trac, or feedback portal. We are always happy to assist you!