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

时间:2013-06-14 17:15:04

标签: c# winforms sorting datagridview

我有一个Windows Form DataGridView,我需要在单击特定列标题时应用自定义排序,并在再次单击列标题时反转排序。

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

DataGridView的数据是通过列表提供的,行正在myList.Rows.Add(string_1, string_2, string_3)添加到DataGridView。

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

我已经在线查看,并且未能找到示例或解释。

任何人都可以向我提供示例代码,或者指向一个很好的网站,该网站会显示如何实现此功能的明确示例。

提前致谢,

马尔

2 个答案:

答案 0 :(得分:6)

这是一个有效的解决方案,我敢打赌,有更多的解决方案可以找到并希望其他人能够进入并为您提供帮助。您只需将自定义代码添加到SortCompare的{​​{1}}事件处理程序并在那里执行您自己的比较函数,此比较函数有2个参数并返回-1,0或1:

DataGridView

要测试它,只需向一列DataGridView添加3行,例如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()); } 。通常,升序(由ColumnHeader上的向上三角形表示)为a,b,c,但上面有a,b,c函数,它将是Compare,同样,降序(由向下指示) ColumnHeader上的三角形为c,b,a,但上面有c,b,a函数,它将是Compare

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

答案 1 :(得分:2)

假设您在此主题中使用排序方法:

how to sort a datagridview by 2 columns

这是一种跟踪用户按正确顺序点击的最新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);
        }
    }
}