在使用 DataGridView时,对于数值列,默认的排序方式仍然是按照字符串方式进行
如果需要按照数值型进行排序,有几种办法,其中一种就是重载SortCompare方法
//重载_SortCompare方法
private void DataGridView1_SortCompare(object sender,DataGridViewSortCompareEventArgs e)
{
// 如果是学号或成绩列,则按浮点数处理
if(e.Column.Name=="学号"|| e.Column.Name=="成绩")
{
e.SortResult = (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) > 0) ? 1 : (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) < 0)?-1:0;
}
//否则,按字符串比较
else
{
e.SortResult = System.String.Compare(Convert.ToString(e.CellValue1), Convert.ToString(e.CellValue2));
}
// 如果发现两行相同,则按学号排序
if (e.SortResult == 0 && e.Column.Name != "学号")
{
e.SortResult = Convert.ToInt32(DataGridView1.Rows[e.RowIndex1].Cells["学号"].Value.ToString()) -
Convert.ToInt32(DataGridView1.Rows[e.RowIndex2].Cells["学号"].Value.ToString());
}
e.Handled = true;//不能省掉,不然没效果
}
DataGridView里面有个事件是ColumnHeaderMouseClick事件(用户单击列标题时发生事件),在事件中插入个排序的代码就可以了
datagridview默认(就是从控件工具箱里拖出来创建到窗体,不修改任何设置)就是允许点击列标题排序.
排序是以当前列的数据为排序依据.
DataGridView gridView;
gridView.Columns[XXX].SortMode = DataGridViewColumnSortMode.Automatic;
设置某一列可以自动排序,这样可以实现你的需求么?
SortMode属性默认为Automatic
使用DataGridView里面的ColumnHeaderMouseClick事件来重写这段逻辑
下面为我的代码
private void dgvCst_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
switch (dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)
{
case SortOrder.None:
case SortOrder.Ascending:
List _lst = (from cst in Data.Where(条件)select cst).OrderByDescending(r => r.UPDATETIME).ToList();
dgvCst.DataSource = _lst;
dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
default:
List _lst1 = (from cst in Data.Where(条件) select cst).OrderBy(r => r.UPDATETIME).ToList();
dgvCst.DataSource = _lst1;
dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
}
}
点击Header列名,可以实现排序功能