C# winform 中datagridview ,如何实现点击列头,对应的列自动排序。

 我来答
有缘无份1967duh
高粉答主

2018-03-30 · 说的都是干货,快来关注
知道大有可为答主
回答量:226
采纳率:100%
帮助的人:4.1万
展开全部

在使用 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;//不能省掉,不然没效果
}  

Extra丶Raybca4a
2013-03-01 · TA获得超过187个赞
知道答主
回答量:104
采纳率:0%
帮助的人:38.7万
展开全部
DataGridView里面有个事件是ColumnHeaderMouseClick事件(用户单击列标题时发生事件),在事件中插入个排序的代码就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
vvsren
2013-02-28 · 超过50用户采纳过TA的回答
知道小有建树答主
回答量:196
采纳率:0%
帮助的人:124万
展开全部
datagridview默认(就是从控件工具箱里拖出来创建到窗体,不修改任何设置)就是允许点击列标题排序.
排序是以当前列的数据为排序依据.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
狮是搞完泪18
2013-02-28 · TA获得超过270个赞
知道小有建树答主
回答量:257
采纳率:0%
帮助的人:259万
展开全部
DataGridView gridView;
gridView.Columns[XXX].SortMode = DataGridViewColumnSortMode.Automatic;
设置某一列可以自动排序,这样可以实现你的需求么?
追问
不行,这个是默认的。
如果用非连接模式,dataGridView1.DataSource = ds.Tables["aa"];,点击列头可以排序的,
但为何用连接模式绑定,绑定dataGridView1.DataSource=list,就不行了呢?
追答
哦,那需要自定义排序了,把这一列的SortMode设置为DataGridViewColumnSortMode.Programmatic
在ColumnHeaderMouClick事件里自己给DataGridView的DataSource排序
这是我写的示例代码,希望对你有所帮助
DataGridView gridView;
gridView.Columns[XXX].SortMode = DataGridViewColumnSortMode.Programmatic;
void ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//取得点击列的索引
int nColumnIndex = gridView.HitTest(e.X, e.Y);
if (!gridView.Columns[nColumnIndex].SortMode == DataGridViewColumnSortMode.Programmatic)
{
return;
}
switch (gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection)
{
case SortOrder.None:
case SortOrder.Ascending:
//在这里加入排序的逻辑
//设置列标题的状体
gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
default:
gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
}
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
明哲555
2019-09-10
知道答主
回答量:2
采纳率:0%
帮助的人:1432
展开全部
  1. SortMode属性默认为Automatic

  2. 使用DataGridView里面的ColumnHeaderMouseClick事件来重写这段逻辑

下面为我的代码

private void dgvCst_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
switch (dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)

{
case SortOrder.None:
case SortOrder.Ascending:

              List<Data> _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<Data> _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列名,可以实现排序功能

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式