天天看點

在DataGridView控件上實作列标頭象Excel帶資料篩選功能

'VB.NET 2008 環境

'建立一個項目後,隻需在Form1中拉一個DataGridView,一個ComboBox,然後将下面代碼複制粘貼即可,其它什麼也不用做

Public Class Form1

    Dim SelectedCol As Integer = 0, IsFindit As Boolean = True

    Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.ColumnCount = 6

        DataGridView1.Rows.Add( 10)

        DataGridView1.AllowUserToAddRows = False

         For i As Integer = 0 To Me.DataGridView1.Columns.Count - 1

             Me.DataGridView1.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable

         Next

         ' 以下所有代碼隻是為了添加演試資料需要

         For i = 0 To DataGridView1.RowCount - 1

             For j As Integer = 0 To DataGridView1.ColumnCount - 1

                DataGridView1.Columns(j).HeaderText = " 第 " & j.ToString & " 列 "

                DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter

                DataGridView1.Rows(i).Cells(j).Value = (i + 5) * (j + 2)

             Next

             If i Mod 2 = 0 Then

                DataGridView1.Rows(i).Cells( 2).Value = " ds "

             Else

                DataGridView1.Rows(i).Cells( 3).Value = " 測試一下 "

             End If

         Next

    End Sub

    Private Sub DataGridView1_ColumnHeaderMouseClick( ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) _

         Handles DataGridView1.ColumnHeaderMouseClick

         ' 這裡是模拟EXCEL排序的關鍵部分

        SelectedCol = e.ColumnIndex

         Dim range As New System.Drawing.Rectangle

         Dim dLeft, dTop As Double

        range = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False)

        dLeft = range.Left + DataGridView1.Left

        dTop = range.Top + DataGridView1.Top

        ComboBox1.SetBounds(dLeft, dTop, range.Width, range.Height)

        ComboBox1.Items.Clear()

        ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList

        ComboBox1.Items.Add( " 請選擇篩選 ")

         For i As Integer = 0 To DataGridView1.RowCount - 1

            IsFindit = False

             For j = 0 To ComboBox1.Items.Count - 1

                If ComboBox1.Items(j).ToString = DataGridView1.Rows(i).Cells(e.ColumnIndex).Value.ToString Then

                    IsFindit = True

                    j = ComboBox1.Items.Count

                End If

             Next

             If Not IsFindit Then ComboBox1.Items.Add(DataGridView1.Rows(i).Cells(e.ColumnIndex).Value.ToString)

         Next

        ComboBox1.SelectedIndex = 0

        ComboBox1.Show()

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged( ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

         ' 這裡是篩選功能

         Select Case ComboBox1.SelectedIndex

             Case 0

                For i As Integer = 0 To DataGridView1.RowCount - 1

                    DataGridView1.Rows(i).Visible = True

                Next

             Case Else

                For i As Integer = 0 To DataGridView1.RowCount - 1

                     If DataGridView1.Rows(i).Cells(SelectedCol).Value.ToString <> ComboBox1.SelectedItem.ToString Then

                        DataGridView1.Rows(i).Visible = False

                     Else

                        DataGridView1.Rows(i).Visible = True

                     End If

                Next

         End Select

         If ComboBox1.SelectedIndex = 0 Then ComboBox1.Hide()

    End Sub

End Class

繼續閱讀