Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / WinForms

DataGridView Filter Popup

3.88/5 (6 votes)
5 Jun 2009CPOL1 min read 50.4K  
A cool way to filter data in a DataGridView.

Introduction

This article is about a neat way I found to filter data in a DataGridView. This works with all grid view I've ever made with very little code change.

Background

This stems from a similar solution I found. It was too complicated for a beginner like me, so I developed a solution that I could understand.

Using the Code

Step 1: add the following code to the form containing the DataGridView. In this case, the form is called "DataGridViewForm".

VB
Private Sub PartsDataGridView_ColumnHeaderMouseClick(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) _
        Handles PartsDataGridView.ColumnHeaderMouseClick

  Search.Show()
End Sub

Step 2: Add a form to your project called Search.vb and set the properties the way you would like. For instance, I have set the form properties FormBorderStyle=None, TopMost=True, BackgroundColor, etc.

I added a Label, TextBox, and two Buttons.

This is the code-behind of the form.

VB
Public Class Search
    Dim columnIndex As Integer
    Dim columnName As String

    Private Sub Search_Load(ByVal sender As Object, _
                ByVal e As System.EventArgs) Handles Me.Load
        Dim loc As Point
        loc = Control.MousePosition
        Me.Location = loc
        Me.TextBox1.Focus()

        columnIndex = DataGridViewForm.PartsDataGridView.SortedColumn.Index
        columnName = DataGridViewForm.PartsDataGridView.Columns(_
                            columnIndex).HeaderText.ToString
        Label1.Text = columnName
    End Sub

    Private Sub btnSearch_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnSearch.Click
        Try
            DataGridViewForm.PartsBindingSource.Filter = _
              String.Format("{0} = '{1}'", _
              DataGridViewForm.ShopPartsDataSet.Parts.Columns(_
                columnIndex).ColumnName.ToString, TextBox1.Text)
        Catch
            MessageBox.Show("Database error")
        End Try
        Me.Close()
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub
End Class

As you can see in the picture, when you click on the header, a window pops up. You enter some text, a part number in this case, and hit the binoculars. Voila!! Your data is filtered.

Image 1

It's super easy!! This should work with any existing form you have out there!!

Points of Interest

I'm not an expert. One thing that I wasn't able to figure out was how to get the selected column index. So that's why I don't have the Search Form popup when I right click. I need to left click, let the DataGrid sort, and get the index of the sorted column.

Also, I added a button to my ToolStrip to clear the filter and re-fill the DataGrid.

Obviously, you will want to change the code to apply this to your project.

"DataGridViewForm" = "Yourform".
"PartsBindingSource" = "YourBindingSource"
"ShopPartsDataSet" = "YourDataSet"
"PartsDataGridView" = "YourDataGridView"

History

No history. Brand new!!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)