C# winfrom datagridview点击列排序重写

需求:将字符串排序改为数字排序
第一种方法是在声明gridview列时就将该列设为int类型,但我从后台接口get的数据就是string,所以需要重写这个方法,代码如下:
首先在设计界面把该列的SortMode设为grammeratic,这样才可以在代码中编辑此方法;
给这个表格列点击赋事件:

 private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
 {
     int index = e.ColumnIndex;

     //只有排序模式为Programmatic的列触发指定排序规则
     if (dataGridView1.Columns[index].SortMode != DataGridViewColumnSortMode.Programmatic)
     {
         return;
     }
     switch (dataGridView1.Columns[index].HeaderCell.SortGlyphDirection)
     {
         case SortOrder.None:
         case SortOrder.Ascending:
             //-----TODO----- 升序:在这里加入各列排序的逻辑
             OrderData(BigTable, dataGridView1, "desc");
             //设置列标题右侧三角形状
             dataGridView1.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Descending;
             break;
         case SortOrder.Descending:
             //-----TODO----- 降序:在这里加入各列排序的逻辑
             OrderData(BigTable, dataGridView1, "asc");
             //设置列标题右侧三角形状
             dataGridView1.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
             break;
     }
 }

里面的OrderData是新写的排序算法,因为我这里目前只需要重写一种排序方法,所以就只写了一个方法,如果其他列还有其他排序逻辑的话(应该也不会有)就需要再写一个switch,通过index判断排序算法;

OrderData的思路是,把表当前数据抓出来重排再放进去

public void OrderData(DataTable BigTable, DataGridView dataSource, string order)
        {
            //获取数据           
            List<PreDeviceInfo> list = new List<PreDeviceInfo>();

            foreach (DataGridViewRow row in dataSource.Rows)
            {
                PreDeviceInfo info = new PreDeviceInfo();

                info.a = row.Cells["a"].Value as String;
                info.b= row.Cells["b"].Value as String;
                info.c= row.Cells["c"].Value as String;
                info.d= row.Cells["d"].Value as String;

                if (!string.IsNullOrEmpty(info.a) || !string.IsNullOrEmpty(info.b) || !string.c(info.c) || !string.IsNullOrEmpty(info.d))
                    list.Add(info);
            }
            if (list.Count != 0)
            {
                if (order == "desc")    //正序
                {
                    list = list.OrderBy(p => p.a.ToInt()).ToList();
                }
                else                    //倒序
                {
                    list = list.OrderByDescending(p => p.a.ToInt()).ToList();
                }
                dataSource.DataSource = list;
            }
        }

这里我遇到了一个问题,就是我的表格是可以添加行的,就是除了你有数据的行数以外,下面永远都会有一行空行;如果把表格中所有数据都放在list里面,排序的时候就会把这个空行排在最上面;从用户角度说,这行应该不参与排序;所以我做了一个判断,都为空的话就不把这行数据加进去;后面呢,应该在排完序以后,再add一个新的空行(这段代码里没有,需要自己写一下)

为什么要add一个新的空行呢,因为dataSource被重置以后,这个空行就没有了;除非你这个地方不用list直接赋进去;经过测试,如果用datatable类型的defaultview存进去,就不需要再加新的空行,表格会自动在后面加上;这段我不太理解是为什么,欢迎讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值