CSharp

GridView Sort

Class Person

public class Person{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    public int Age { get; set; }
    public bool Gender { get; set; }
}

class FormPerson

public partial class FormPerson : Form{
    List<Person> people = new List<Person>{
        new Person { Id = 1, Name = "Alice", Age = 30 , Gender = false},
        new Person { Id = 2, Name = "Bob", Age = 25 , Gender = true},
        new Person { Id = 3, Name = "John", Age = 35 , Gender = false},
        new Person { Id = 4, Name = "Charlie", Age = 35 , Gender = false}
    };
    public FormPerson(){
        InitializeComponent();
    }
    private void FormPerson_Load(object sender, EventArgs e){
        gvPerson.DataSource = people;
        gvPerson.ColumnHeaderMouseClick += GvPerson_ColumnHeaderMouseClick;
    }
    private void GvPerson_ColumnHeaderMouseClick(object? sender, DataGridViewCellMouseEventArgs e){
        if(e.ColumnIndex < 3){
            DataGridViewColumn column = gvPerson.Columns[e.ColumnIndex];
            SortOrder sortOrder = column.HeaderCell.SortGlyphDirection;
            sortOrder = sortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
            switch (e.ColumnIndex){
                case 0:
                    people = (sortOrder == SortOrder.Ascending) ? people.OrderBy(p => p.Id).ToList() : people.OrderByDescending(p => p.Id).ToList();
                    break;
                case 1:
                    people = (sortOrder == SortOrder.Ascending) ? people.OrderBy(p => p.Name).ToList() : people.OrderByDescending(p => p.Name).ToList();
                    break;
                case 2:
                    people = (sortOrder == SortOrder.Ascending) ? people.OrderBy(p => p.Age).ToList() : people.OrderByDescending(p => p.Age).ToList();
                    break;
            }
            gvPerson.DataSource = null;
            gvPerson.DataSource = people;
            gvPerson.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = sortOrder;
        }
    }
}