// 方法1 dataGridView1.ColumnHeaderMouseClick += tempView_ColumnHeaderMouseClick; DataTable dt = Create(); dataGridView1.DataSource = dt; // 方法2 dataGridView2.SortCompare += dataGridView2_SortCompare; fillDatagridview(dataGridView2, dt); #region 方法1,已知那一列是日期类型,以datasourcr方式绑定数据 // 创建表,为了culture的原因,日期列的数据源类型是字符串而不是日期类型 public DataTable Create() DataTable dt = new DataTable(); dt.Columns.Add( " name " ); dt.Columns.Add( " birthdate " ); dt.Rows.Add( " m " , " 04.01.1969 " ); dt.Rows.Add( " n " , " 05.12.1961 " ); dt.Rows.Add( " n " , " 06.04.1963 " ); catch (Exception) throw ; return dt; // 方法1,已知那一列是日期类型,以datasourcr方式绑定数据 void tempView_ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e) if (e.ColumnIndex >= 0 ) DataGridView dgv = ((DataGridView)sender); if (e.ColumnIndex == 1 ) // foreach (DataRow row in dt.Rows.Cast<DataRow>().OrderBy(r => DateTime.Parse(r["birthdate"].ToString()))) DataTable dt = (DataTable)dgv.DataSource; DataTable dtNew = new DataTable(); if (dgv.Tag == null || dgv.Tag.ToString() == " Desc " ) dgv.Tag = " Asc " ; dtNew = dt.Rows.Cast<DataRow>().OrderBy(r => DateTime.Parse(r[ " birthdate " ].ToString())).CopyToDataTable(); dgv.Tag = " Desc " ; dtNew = dt.Rows.Cast<DataRow>().OrderByDescending(r => DateTime.Parse(r[ " birthdate " ].ToString())).CopyToDataTable(); dgv.DataSource = null ; dgv.DataSource = dtNew; catch #endregion #region 方法2 SortCompare,:只适用非datasource方式绑定的数据源,所以用这个方法数据必须一行行添加到gridview // 方法2:只适用非datasource方式绑定的数据源 // 并且this.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic; void dataGridView2_SortCompare( object sender, DataGridViewSortCompareEventArgs e) CompareDate(e); // 按照日期比较 private static void CompareDate(DataGridViewSortCompareEventArgs e) DateTime cell1 = DateTime.MinValue; DateTime cell2 = DateTime.MinValue; bool t1 = DateTime.TryParse(e.CellValue1.ToString(), out cell1); bool t2 = DateTime.TryParse(e.CellValue2.ToString(), out cell2); if (t1 && t2) e.SortResult = System.DateTime.Compare(cell1, cell2); e.Handled = true ; catch (Exception) // 按照数字比较 private static void CompareNumber(DataGridViewSortCompareEventArgs e) Decimal cell1 = Decimal.MinValue; Decimal cell2 = Decimal.MinValue; bool t1 = Decimal.TryParse(e.CellValue1.ToString(), out cell1); bool t2 = Decimal.TryParse(e.CellValue2.ToString(), out cell2); if (t1 && t2) e.SortResult = (cell1 == cell2 ? 0 : (cell1 > cell2 ? 1 : - 1 )); e.Handled = true ; catch (Exception) private void fillDatagridview(DataGridView dataGridView1, DataTable dt) dataGridView1.DataSource = null ; dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); for ( int i = 0 ; i < dt.Columns.Count; i++ ) dataGridView1.Columns.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); for ( int i = 0 ; i < dt.Rows.Count; i++ ) dataGridView1.Rows.Add(); for ( int j = 0 ; j < dt.Columns.Count; j++ ) dataGridView1.Rows[i].Cells[j].Value = dt.Rows[i][j]; #endregion #region 其他方法,改变列数据类型 // 由于种种原因,dgv上绑定的数据表里面的日期类型是字符串(为了适用各个国家的日期格式,日期类型专门做了格式化),后期再改回正确类型 // 在有数据的情况下,列类型是不能修改的,所以用临时列 public static void ChangeColumnDataType(DataGridView dgv) DataTable dt = (DataTable)dgv.DataSource; if (dt.Rows.Count > 0 ) for ( int i = 0 ; i < dt.Columns.Count; i++ ) DateTime time = DateTime.MinValue; if (DateTime.TryParse(dt.Rows[ 0 ][i].ToString(), out time)) ChangeColumnDataType(dt, dt.Columns[i].ColumnName, typeof (DateTime)); public static bool ChangeColumnDataType(DataTable table, string columnname, Type newtype) if (table.Columns.Contains(columnname) == false ) return false ; DataColumn column = table.Columns[columnname]; if (column.DataType == newtype) return true ; DataColumn newcolumn = new DataColumn( " temporary " , newtype); table.Columns.Add(newcolumn); foreach (DataRow row in table.Rows) row[ " temporary " ] = Convert.ChangeType(row[columnname], newtype); catch table.Columns.Remove(columnname); newcolumn.ColumnName = columnname; catch (Exception) return false ; return true ; #endregion