Alex Rivera | Logout

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

Asked 2011-04-05T14:01:39.350
83

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, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth })
                                   .OrderBy(s => s.Apellidos)
                                   .ToList();

Now, I use the s.Apellidos as the default sort, but I'd also like to allow users to sort when clicking on the column header.

This sort will not modify the data in any way, it's just a client side bonus to allow for easier searching for information when scanning the screen with their eyes.

Edit
Report

2 Answers

5

You can use DataGridViewColoumnHeaderMouseClick event like this :

Private string order = String.Empty;
private void dgvDepartment_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (order == "d")
{
        order = "a";                
dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth })   .OrderBy(s => s.Apellidos).ToList();
    }
    else
    {
        order = "d";
        dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth }.OrderByDescending(s => s.Apellidos)  .ToList()
    }
}
answered 2011-07-21T10:29:47.993
1

If you get an error message like

An unhandled exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

if you work with SortableBindingList, your code probably uses some loops over DataGridView rows and also try to access the empty last row! (BindingSource = null)

If you don't need to allow the user to add new rows directly in the DataGridView this line of code easily solve the issue:

InitializeComponent();
m_dataGridView.AllowUserToAddRows = false; // after components initialized
...
answered 2013-06-17T13:07:29.060

Your Answer