在DataGridView控件上实现列标头象Excel带数据筛选功能
程序代码:
'近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考。 ' 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
请有需要的朋友尽管拿去,也可以尝试加强其功能