C# DataGridView sorting with Generic List as underlying source

前端 未结 9 1835
情书的邮戳
情书的邮戳 2020-12-05 03:22

I\'m using a Windows Forms DataGridView to display a generic list of MyObject objects.

First of all I wrap this collection into a

9条回答
  •  旧巷少年郎
    2020-12-05 03:52

    If creating your own user control is preferable, you can make a custom sort method using the code below:

        private string _lastSortColumn;
        private ListSortDirection _lastSortDirection;
    
        public void Sort(DataGridViewColumn column)
        {
            // Flip sort direction, if the column chosen was the same as last time
            if (column.Name == _lastSortColumn)
                _lastSortDirection = 1 - _lastSortDirection;
            // Otherwise, reset the sort direction to its default, ascending
            else
            {
                _lastSortColumn = column.Name;
                _lastSortDirection = ListSortDirection.Ascending;
            }
    
            // Prep data for sorting
            var data = (IEnumerable)DataSource;
            var orderProperty = column.DataPropertyName;
    
            // Sort data
            if (_lastSortDirection == ListSortDirection.Ascending)
                DataSource = data.OrderBy(x => x.GetType().GetProperty(orderProperty).GetValue(x, null)).ToList();
            else
                DataSource = data.OrderByDescending(x => x.GetType().GetProperty(orderProperty).GetValue(x, null)).ToList();
    
            // Set direction of the glyph
            Columns[column.Index].HeaderCell.SortGlyphDirection
                = _lastSortDirection == ListSortDirection.Ascending
                ? SortOrder.Ascending : SortOrder.Descending;
        }
    

    You can then override the header click method to call your sort function:

        protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)
        {
            base.OnColumnHeaderMouseClick(e);
    
            var column = Columns[e.ColumnIndex];
    
            if (column.SortMode == DataGridViewColumnSortMode.Automatic
                || column.SortMode == DataGridViewColumnSortMode.NotSortable)
                Sort(column);
        }
    

提交回复
热议问题