最近写的一个程序中需要用到DataGridView的多列排序,参考了一下MSDN上的东西,似乎只能用于两列而且不是很灵活(也许是我没有真正弄明白),由于时间的关系,没有仔细去研究。想到了下面这个方法:
代码
1
using
System;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Windows.Forms;
5
6 namespace DataGridViewColumnSort
7 {
8 /// <summary>
9 /// Description of MainForm.
10 /// </summary>
11 public partial class MainForm : Form
12 {
13 public MainForm()
14 {
15 //
16 // The InitializeComponent() call is required for Windows Forms designer support.
17 //
18 InitializeComponent();
19
20 //
21 // TODO: Add constructor code after the InitializeComponent() call.
22 //
23 this .BuildSortInfoTable();
24 this .FillDataGridView();
25 this .SetColumnSortMode();
26 }
27
28 private System.Data.DataTable dtSort;
29 private System.Data.DataView dv;
30
31 private void BuildSortInfoTable()
32 {
33 dtSort = new System.Data.DataTable();
34 dtSort.Columns.Add( " Field " ,System.Type.GetType( " System.String " ));
35 dtSort.Columns.Add( " Sort " ,System.Type.GetType( " System.String " ));
36 dtSort.Columns.Add( " ColumnText " ,System.Type.GetType( " System.String " ));
37 dtSort.Columns.Add( " ColumnIndex " ,System.Type.GetType( " System.String " ));
38 }
39
40 private void FillDataGridView()
41 {
42 System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
43 cn.ConnectionString = " Server=.;User ID=sa;Password=;Database=Northwind " ;
44 string strSQL = " select LastName,FirstName,Title,BirthDate,Address,City from Employees " ;
45 System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter(strSQL,cn);
46 System.Data.DataSet ds = new System.Data.DataSet();
47 ad.Fill(ds);
48 dv = ds.Tables[ 0 ].DefaultView;
49 this .dataGridView1.DataSource = dv;
50 }
51
52 private void SetColumnSortMode()
53 {
54 for ( int i = 0 ;i < this .dataGridView1.Columns.Count;i ++ )
55 {
56 this .dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic;
57 }
58 }
59
60 void DataGridView1ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e)
61 {
62 for ( int i = 0 ;i < this .dataGridView1.Columns.Count;i ++ )
63 {
64 this .dataGridView1.Columns[i].ToolTipText = null ;
65 }
66 string strField = this .dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
67 if (dtSort.Rows.Count == 0 )
68 {
69 System.Data.DataRow dr = dtSort.NewRow();
70 dr[ 0 ] = strField;
71 dr[ 1 ] = " ASC " ;
72 dr[ 2 ] = this .dataGridView1.Columns[e.ColumnIndex].HeaderText;
73 dr[ 3 ] = e.ColumnIndex;
74 dtSort.Rows.Add(dr);
75 }
76 else
77 {
78 if (dtSort.Select( " Field=' " + strField + " ' " ).Length == 0 )
79 {
80 System.Data.DataRow dr = dtSort.NewRow();
81 dr[ 0 ] = strField;
82 dr[ 1 ] = " ASC " ;
83 dr[ 2 ] = this .dataGridView1.Columns[e.ColumnIndex].HeaderText;
84 dr[ 3 ] = e.ColumnIndex;
85 dtSort.Rows.Add(dr);
86 }
87 else
88 {
89 for ( int i = 0 ;i < dtSort.Rows.Count;i ++ )
90 {
91 if (dtSort.Rows[i][ 0 ].ToString() == strField)
92 {
93 if (dtSort.Rows[i][ 1 ].ToString() == " ASC " )
94 {
95 dtSort.Rows[i][ 1 ] = " DESC " ;
96 break ;
97 }
98 else
99 {
100 dtSort.Rows.RemoveAt(i);
101 }
102 }
103 }
104 }
105 }
106 dv.Sort = null ;
107 for ( int i = 0 ;i < dtSort.Rows.Count;i ++ )
108 {
109 if (i == 0 )
110 dv.Sort = dtSort.Rows[i][ 0 ].ToString() + " " + dtSort.Rows[i][ 1 ].ToString();
111 else
112 dv.Sort += " , " + dtSort.Rows[i][ 0 ].ToString() + " " + dtSort.Rows[i][ 1 ].ToString();
113 int iIndex = Convert.ToInt32(dtSort.Rows[i][ 3 ]);
114 if (dtSort.Rows[i][ 1 ].ToString() == " ASC " )
115 this .dataGridView1.Columns[iIndex].ToolTipText = dtSort.Rows[i][ 2 ].ToString() + " 升序 " + (i + 1 ).ToString();
116 else
117 this .dataGridView1.Columns[iIndex].ToolTipText = dtSort.Rows[i][ 2 ].ToString() + " 降序 " + (i + 1 ).ToString();
118 }
119 }
120 }
121 }
122
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Windows.Forms;
5
6 namespace DataGridViewColumnSort
7 {
8 /// <summary>
9 /// Description of MainForm.
10 /// </summary>
11 public partial class MainForm : Form
12 {
13 public MainForm()
14 {
15 //
16 // The InitializeComponent() call is required for Windows Forms designer support.
17 //
18 InitializeComponent();
19
20 //
21 // TODO: Add constructor code after the InitializeComponent() call.
22 //
23 this .BuildSortInfoTable();
24 this .FillDataGridView();
25 this .SetColumnSortMode();
26 }
27
28 private System.Data.DataTable dtSort;
29 private System.Data.DataView dv;
30
31 private void BuildSortInfoTable()
32 {
33 dtSort = new System.Data.DataTable();
34 dtSort.Columns.Add( " Field " ,System.Type.GetType( " System.String " ));
35 dtSort.Columns.Add( " Sort " ,System.Type.GetType( " System.String " ));
36 dtSort.Columns.Add( " ColumnText " ,System.Type.GetType( " System.String " ));
37 dtSort.Columns.Add( " ColumnIndex " ,System.Type.GetType( " System.String " ));
38 }
39
40 private void FillDataGridView()
41 {
42 System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
43 cn.ConnectionString = " Server=.;User ID=sa;Password=;Database=Northwind " ;
44 string strSQL = " select LastName,FirstName,Title,BirthDate,Address,City from Employees " ;
45 System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter(strSQL,cn);
46 System.Data.DataSet ds = new System.Data.DataSet();
47 ad.Fill(ds);
48 dv = ds.Tables[ 0 ].DefaultView;
49 this .dataGridView1.DataSource = dv;
50 }
51
52 private void SetColumnSortMode()
53 {
54 for ( int i = 0 ;i < this .dataGridView1.Columns.Count;i ++ )
55 {
56 this .dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic;
57 }
58 }
59
60 void DataGridView1ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e)
61 {
62 for ( int i = 0 ;i < this .dataGridView1.Columns.Count;i ++ )
63 {
64 this .dataGridView1.Columns[i].ToolTipText = null ;
65 }
66 string strField = this .dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
67 if (dtSort.Rows.Count == 0 )
68 {
69 System.Data.DataRow dr = dtSort.NewRow();
70 dr[ 0 ] = strField;
71 dr[ 1 ] = " ASC " ;
72 dr[ 2 ] = this .dataGridView1.Columns[e.ColumnIndex].HeaderText;
73 dr[ 3 ] = e.ColumnIndex;
74 dtSort.Rows.Add(dr);
75 }
76 else
77 {
78 if (dtSort.Select( " Field=' " + strField + " ' " ).Length == 0 )
79 {
80 System.Data.DataRow dr = dtSort.NewRow();
81 dr[ 0 ] = strField;
82 dr[ 1 ] = " ASC " ;
83 dr[ 2 ] = this .dataGridView1.Columns[e.ColumnIndex].HeaderText;
84 dr[ 3 ] = e.ColumnIndex;
85 dtSort.Rows.Add(dr);
86 }
87 else
88 {
89 for ( int i = 0 ;i < dtSort.Rows.Count;i ++ )
90 {
91 if (dtSort.Rows[i][ 0 ].ToString() == strField)
92 {
93 if (dtSort.Rows[i][ 1 ].ToString() == " ASC " )
94 {
95 dtSort.Rows[i][ 1 ] = " DESC " ;
96 break ;
97 }
98 else
99 {
100 dtSort.Rows.RemoveAt(i);
101 }
102 }
103 }
104 }
105 }
106 dv.Sort = null ;
107 for ( int i = 0 ;i < dtSort.Rows.Count;i ++ )
108 {
109 if (i == 0 )
110 dv.Sort = dtSort.Rows[i][ 0 ].ToString() + " " + dtSort.Rows[i][ 1 ].ToString();
111 else
112 dv.Sort += " , " + dtSort.Rows[i][ 0 ].ToString() + " " + dtSort.Rows[i][ 1 ].ToString();
113 int iIndex = Convert.ToInt32(dtSort.Rows[i][ 3 ]);
114 if (dtSort.Rows[i][ 1 ].ToString() == " ASC " )
115 this .dataGridView1.Columns[iIndex].ToolTipText = dtSort.Rows[i][ 2 ].ToString() + " 升序 " + (i + 1 ).ToString();
116 else
117 this .dataGridView1.Columns[iIndex].ToolTipText = dtSort.Rows[i][ 2 ].ToString() + " 降序 " + (i + 1 ).ToString();
118 }
119 }
120 }
121 }
122
大致的思路就是利用DataGridView绑定数据源DataView对象的Sort方法来实现,还是通过点击DataGridView的列头来实现。为了显示列排序的方式和顺序使用了ToolTip。
方法还有缺陷有待改进,先贴出来和大家分享。