DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

Posted 小A永不败

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样相关的知识,希望对你有一定的参考价值。

‘近日有本论坛网友问: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
[VB.net]DataGridView实现列标头
不说也罢 张贴于 2013年5月31日 20:02
贴新代码 克隆分支

  

以上是关于DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样的主要内容,如果未能解决你的问题,请参考以下文章

C# datagridview怎么实现筛选

DataGridView使用技巧十三:点击列头实现升序和降序排序

C#;麻烦好心人:如何实现dataGridView的筛选?

C#中的DATAGRIDVIEW表格可以进行条件筛选的显示数据吗?

如何定位DataGridView中的某行中的某列

datagridview 怎么在头一列加个全选?c#