如何通过单击列标题以编程方式对DataGridView进行排序

本文关键字:DataGridView 排序 方式 编程 单击 何通过 标题 | 更新日期: 2023-09-27 18:18:21

我有一个Windows窗体DataGridView,我需要应用自定义排序时,一个特定的列标头被点击,并在列标头再次被点击时反向排序。

我将实现我自己的排序算法,但是我不清楚如何使用事件连接或触发列标头click,然后跟踪应用于该列的最后一次排序,以便我可以反转排序过程。

DataGridView的数据是通过列表提供的,并且行作为myList.Rows.Add(string_1, string_2, string_3)被添加到DataGridView。

请注意,这不是我的代码,我只是被要求为每个列实现一个自定义排序。

我在网上看了看,没有找到例子或解释。

谁能给我提供样例代码,或指向我一个好的网站,显示如何实现这个清晰的例子。

提前感谢,

Marwan

如何通过单击列标题以编程方式对DataGridView进行排序

这是一个有效的解决方案,我敢打赌还有更多的解决方案要找到,希望其他人会跳起来给你。您只需为DataGridViewSortCompare事件处理程序添加自定义代码并在那里执行自己的比较函数,该比较函数有2个参数并返回- 1,0或1:

private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
   if(e.Column == [your desired column]){
     e.Handled = true;
     e.SortResult = Compare(e.CellValue1, e.CellValue2);
   }
}
//Here is my compare function, it simply reverts the normal comparison result
private int Compare(object o1, object o2)
{
   return -o1.ToString().CompareTo(o2.ToString());
}

要测试它,只需向单列DataGridView(如a,b,c)添加3行。通常升序(由ColumnHeader上的向上三角形表示)是a,b,c,但对于上面的Compare函数,它将是c,b,a;类似地,降序(由ColumnHeader上的向下三角形表示)是c,b,a,但对于上面的Compare函数,它将是a,b,c

您可以添加更多自己的Compare函数,并为您喜欢的每个Column使用每个函数。我认为重要的是如何定义这些函数,我不知道你为什么要这样做,因为默认的比较是OK的。

如果您在此线程中使用排序方法:

如何对datagridview按2列排序

这是一个简单的方法来跟踪用户按正确顺序点击的最新N列。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly Stack<int> _stack = new Stack<int>();
        public Form1()
        {
            InitializeComponent();
        }
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            // Column history
            _stack.Push(e.ColumnIndex);
            // Number of columns to track
            int columns = 3;
            // Build sort string
            int[] array = _stack.Distinct().ToArray();
            var builder = new StringBuilder();
            for (int index = 0; index < array.Length; index++)
            {
                int i = array[index];
                if (index >= columns)
                {
                    break;
                }
                DataGridViewColumn gridViewColumn = dataGridView1.Columns[i];
                string sort = null;
                switch (gridViewColumn.HeaderCell.SortGlyphDirection)
                {
                    case SortOrder.None:
                    case SortOrder.Ascending:
                        sort = "ASC";
                        break;
                    case SortOrder.Descending:
                        sort = "DESC";
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
                builder.AppendFormat("{0} {1}, ", gridViewColumn.Name, sort);
            }
            string s = builder.ToString();
            s = s.Remove(s.Length - 2);
            Console.WriteLine(s);
        }
    }
}