How to enable DataGridView sorting when user clicks on the column header?

前端 未结 15 949
误落风尘
误落风尘 2020-12-02 15:28

I have a datagridview on my form and I populate it with this:

dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombr         


        
15条回答
  •  一生所求
    2020-12-02 15:49

    put this line in your windows form (on load or better in a public method like "binddata" ):

    //
    // bind the data and make the grid sortable 
    //
    this.datagridview1.MakeSortable( myenumerablecollection ); 
    

    Put this code in a file called DataGridViewExtensions.cs (or similar)

    // MakeSortable extension. 
    // this will make any enumerable collection sortable on a datagrid view.  
    
    //
    // BEGIN MAKESORTABLE - Mark A. Lloyd
    //
    // Enables sort on all cols of a DatagridView 
    
    //
    
    
    
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Threading.Tasks;
        using System.Windows.Forms;
    
        public static class DataGridViewExtensions
        {
        public static void MakeSortable(
            this DataGridView dataGridView, 
            IEnumerable dataSource,
            SortOrder defaultSort = SortOrder.Ascending, 
            SortOrder initialSort = SortOrder.None)
        {
            var sortProviderDictionary = new Dictionary>>();
            var previousSortOrderDictionary = new Dictionary();
            var itemType = typeof(T);
            dataGridView.DataSource = dataSource;
            foreach (DataGridViewColumn c in dataGridView.Columns)
            {
                object Provider(T info) => itemType.GetProperty(c.Name)?.GetValue(info);
                sortProviderDictionary[c.Index] = so => so != defaultSort ? 
                    dataSource.OrderByDescending(Provider) : 
                    dataSource.OrderBy(Provider);
                previousSortOrderDictionary[c.Index] = initialSort;
            }
    
            async Task DoSort(int index)
            {
    
                switch (previousSortOrderDictionary[index])
                {
                    case SortOrder.Ascending:
                        previousSortOrderDictionary[index] = SortOrder.Descending;
                        break;
                    case SortOrder.None:
                    case SortOrder.Descending:
                        previousSortOrderDictionary[index] = SortOrder.Ascending;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
    
                IEnumerable sorted = null;
                dataGridView.Cursor = Cursors.WaitCursor;
                dataGridView.Enabled = false;
                await Task.Run(() => sorted = sortProviderDictionary[index](previousSortOrderDictionary[index]).ToList());
                dataGridView.DataSource = sorted;
                dataGridView.Enabled = true;
                dataGridView.Cursor = Cursors.Default;
    
            }
    
            dataGridView.ColumnHeaderMouseClick+= (object sender, DataGridViewCellMouseEventArgs e) => DoSort(index: e.ColumnIndex);
        }
    }
    

提交回复
热议问题