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
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

Ran1002

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值