c# Winform DataGridView 排序教学+自定义排序实现(基于SortCompare事件)

         最近在进行c#窗体应用,需要对DataGridView 显示的数据进行一些比较复杂的排序操作,于是去搜索了winform里的DataGridView 排序方法,搜索得到的实现方式都显得比较复杂,实现起来具有一定难度且不一定满足我个人的需求。无意中看到了微软的官方文档里面有一种实现简单,结果优异的排序方法,自己实现了一下发现效果确实不错,于是跟大家分享一下。

         为了照顾刚入门的同学,先讲述一下Winform DataGridView自带的简单排序怎么使用。已经明白的可以直接略过。

1.选中datagridview,点击其右上角的三角形进入编辑列。

2.选中你需要排序的列,将其SortMode属性设为Automatic

设置完成后,点击列标题即可使用该列属性对整个datagridview进行排序。

        这种排序方法非常简单,但是难以满足我们的各种需求。比如说我的电脑编号写入datagridview的时候是以字符串形式写入(为了添加长下划线使用户知道这里可以点击),排序的时候就会默认以字符串的对比结果来得到排序结果,造成升序的时候10会排在2前面这种尴尬的事情。那么我们也没有一种方法既能使用datagridview的自动排序又能自定义规则呢?我们只要利用datagridview里面的SortCompare事件即可轻松做到此事。各行属性值的比对结果原本是由系统自己进行比较得到,我们使用SortCompare事件即可自定义比较规则,达到自定义排序的目的。

SortCompare事件的添加

        打开datagridview的属性页面,选择事件,找到SortCompare并双击即可。

        现在比如说我想实现编号按数字大小排序,那么通过以下代码即可轻松做到

  private void dataGridView_mac_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {

            int column = e.Column.Index;
            int row1 = e.RowIndex1;
            int row2 = e.RowIndex2;
            if (column == 1)
            {
                int value1 = Convert.ToInt32(e.CellValue1.ToString().Replace("_", ""));
                int value2 = Convert.ToInt32(e.CellValue2.ToString().Replace("_", ""));
                if (value1 > value2)
                    e.SortResult = 1;
                else if (value2 == value1)
                    e.SortResult = 0;
                else e.SortResult = -1;
                e.Handled = true;
            }
        }

        切记在得到自己的排序结果之后,需要将e.Handled的值设为true,告诉系统你已帮它完成了排序,不然系统会继续按照自己的规则进行排序并将你的结果覆盖掉。。。下图为实现效果。

 可以看到做到了电脑编号按数字大小进行排序。

        假如说我现在对排序具有更高的要求,需要同时根据两列数据进行排序,那么单纯利用SortCompare事件能不能做到呢?答案是肯定的。SortCompare事件其实就相当于自己订立规则,那么只要规则代码写得好,那么什么骚操作都是可以做到的(SortCompare是行之间比对排序触发,那么如果在比较的时候除了正在对比的两行外还需要涉及到其他行的数据可能就没有办法了)。 我现在要实现在除电脑编号以外的其他列进行排序时如果出现值相同的情况,以电脑编号为升序进行排列,以下为实现代码与实现结果。

private void dataGridView_mac_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {

            int column = e.Column.Index;
            int row1 = e.RowIndex1;
            int row2 = e.RowIndex2;
            if (column == 1)
            {
                int value1 = Convert.ToInt32(e.CellValue1.ToString().Replace("_", ""));
                int value2 = Convert.ToInt32(e.CellValue2.ToString().Replace("_", ""));
                if (value1 > value2)
                    e.SortResult = 1;
                else if (value2 == value1)
                    e.SortResult = 0;
                else e.SortResult = -1;
            }
            else
            {
                SortOrder so = this.dataGridView_mac.Columns[column].HeaderCell.SortGlyphDirection;
                if (so == SortOrder.Ascending)
                {
                    if (string.Compare(e.CellValue1.ToString(), e.CellValue2.ToString()) != 0)
                    {
                        e.SortResult = string.Compare(e.CellValue1.ToString(), e.CellValue2.ToString());
                    }
                    else
                    {

                        if (Convert.ToInt32(dataGridView_mac.Rows[row1].Cells[1].Value.ToString().Replace("_", "")) > Convert.ToInt32(dataGridView_mac.Rows[row2].Cells[1].Value.ToString().Replace("_", "")))
                        {
                            e.SortResult = 1;
                        }
                        else { e.SortResult = -1; }
                    }
                }
                else
                {
                    if (string.Compare(e.CellValue1.ToString(), e.CellValue2.ToString()) != 0)
                    {
                        e.SortResult = string.Compare(e.CellValue1.ToString(), e.CellValue2.ToString());
                    }
                    else
                    {

                        if (Convert.ToInt32(dataGridView_mac.Rows[row1].Cells[1].Value.ToString().Replace("_", "")) > Convert.ToInt32(dataGridView_mac.Rows[row2].Cells[1].Value.ToString().Replace("_", "")))
                        {
                            e.SortResult = -1;
                        }
                        else { e.SortResult = 1; }
                    }
                }
            }
            e.Handled = true;

        }

 点击链接状态后如果链接状态相同,那么电脑编号必定为升序。

        最后提醒一下,SortResult只是告诉系统比较两个值的比较结果,升序或降序是由系统决定的(或者说由你列标题点击次数决定的),所以想实现永远升序的效果,就需要在降序的时候给予系统完全相反的结果,反之亦然。

 相关链接:在 DataGridView 控件中自定义排序 - Windows Forms .NET Framework | Microsoft Docs

        如果这篇文章对你有帮助的话,帮忙点个赞或收藏哦。

 

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值