Winform dataGridView 多列排序问题 (不重新访问数据库)

//客户要求 做一个跟Excel 多列排序   排序操作可能会频繁  

//注意:我这里设置的0,要排序的字段不能放在dataGridView第一列,可以把自增列作为第一列或者随便添一个隐藏掉

//这里只设置了3列,
        private bool[] sort = { true, true, true };
        private int[] sorts = { 0, 0, 0 };
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            int px = this.dataGridView1.SortedColumn.Index;
            if (sorts[0] == px && sort[0])
            {
                sort[0] = false;
            }
            else if (sorts[0] == px && !sort[0])
            {
                sort[0] = true;
            }
            if (sorts[1] == px && sort[1])
            {
                sort[1] = false;
            }
            else if (sorts[1] == px && !sort[1])
            {
                sort[1] = true;
            }
            if (sorts[2] == px && sort[2])
            {
                sort[2] = false;
            }
            else if (sorts[2] == px && !sort[2])
            {
                sort[2] = true;
            }


            if (sorts[0] != 0 && sorts[1] != 0 && sorts[2] != 0)
            {
                if (sorts[0] != px && sorts[1] != px && sorts[2] != px)
                {
                    string name = dataGridView1.Columns[sorts[0]].HeaderText.Replace("🔺", "").Replace("🔻", "");
                    dataGridView1.Columns[sorts[0]].HeaderText = name;
                    sorts[0] = sorts[1];
                    sort[0] = sort[1];
                    sorts[1] = sorts[2];
                    sort[1] = sort[2];
                    sorts[2] = px;
                    sort[2] = false;
                }
            }

            if (sorts[0] == 0)
            {
                sorts[0] = px;
                sort[0] = false;
            }
            else if (sorts[1] == 0 && px != sorts[0])
            {
                sorts[1] = px;
                sort[1] = false;
            }
            else if (sorts[2] == 0 && px != sorts[0] && px != sorts[1])
            {
                sorts[2] = px;
                sort[2] = false;
            }
            string orderby = "";
            for (int i = 0; i < sorts.Length; i++)
            {
                string name = dataGridView1.Columns[sorts[i]].HeaderText.Replace("🔺", "").Replace("🔻", "");
                if (sorts[i] > 0)
                {
                    if (!sort[i])
                    {
                        orderby += dataGridView1.Columns[sorts[i]].DataPropertyName + " ASC,";

                        //这里尝试用dataGridView本身去进行排序  要排序的表头箭头是有的  但是排序后是不正确的  排序应该是最后一个点的列排序的结果
                        //dataGridView1.Columns[sorts[i]].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Ascending;

                        //找不到只设置表头排序箭头方向的方法   只好自己搞一个
                        dataGridView1.Columns[sorts[i]].HeaderText = "🔺" + name;
                    }
                    else
                    {
                        orderby += dataGridView1.Columns[sorts[i]].DataPropertyName + " DESC,";
                        //dataGridView1.Columns[sorts[i]].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Descending;
                        dataGridView1.Columns[sorts[i]].HeaderText = "🔻" + name;
                    }
                }
            }
            dataTable1.DefaultView.Sort = orderby.TrimEnd(',');
            dataTable1 = dataTable1.DefaultView.ToTable();
            dataGridView1.DataSource = dataTable1;
        }

结果如图:

​​​​​​​

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值