C# winforms gridview sorting after binding data programatically

2k Views Asked by At

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.columnheadermouseclick(v=vs.110).aspx

private void dataGridView1_ColumnHeaderMouseClick(
    object sender, DataGridViewCellMouseEventArgs e)
{
    ...
    // Sort the selected column.
    dataGridView1.Sort(newColumn, direction);
    newColumn.HeaderCell.SortGlyphDirection =
        direction == ListSortDirection.Ascending ?
        SortOrder.Ascending : SortOrder.Descending;
}

public CustomersListWrapper(DataGridView gridView)
{
    _gridView = gridView;
    _gridView.CellClick += dgwCustomersList_CellContentClick;
    _gridView.ColumnHeaderMouseClick += dgwCustomersList_ColumnHeaderMouseClick;

    ClearGrid();
    SetCustomersListHeader();
    ....

}

private void ClearGrid()
{
    _gridView.Rows.Clear();
    _gridView.Columns.Clear();
}

private void SetCustomersListHeader()
{
    _gridView.Columns.Add(DataGridViewColumnNames.Customers.ID, "Id");
    _gridView.Columns.Add(DataGridViewColumnNames.Customers.NAME, "Ime");
    _gridView.Columns[1].Width = 360;
    _gridView.Columns.Add(DataGridViewColumnNames.Customers.SURNAME, "Priimek");
    _gridView.Columns[2].Width = 360;
    _gridView.Columns.Add(DataGridViewColumnNames.Customers.ACCOUNT_NUMBER, "Št. računa");
    _gridView.Columns[3].Width = 120;
    _gridView.Columns.Add(DataGridViewColumnNames.Customers.CUSTOMER_NUMBER, "Št. stranke");
    _gridView.Columns[4].Width = 120;

    int nLastColumn = _gridView.Columns.Count - 1;
    for (int i = 0; i < _gridView.Columns.Count; i++)
    {
        if (nLastColumn == i)
        {
            _gridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    }
    ...
}

but the problem is that sorting is not working it is always Ascending. I am binding every time new data to the grid dynamically and looks like this reset the grid sorting,

newColumn.HeaderCell.SortGlyphDirection

has correct value but after binding data data is lost and SortGlyphDirection is None again.

can I somehow remember value of the Column of the gridview after binding?

2

There are 2 best solutions below

0
On

I suppose you are binding data source from DataTable right? Changing data source resets previous sorting, I think there is more ways how handle this issue:

- store last used sorting order in variable and use DataGridView.DataSourceChanged or DataGridView.DataBindingComplete events to sort your new data source and refresh grid

- store last used sorting order and before attaching new data source sort your source DataTable to sorting order used in DataGridView and change datasource after this

0
On

You must inherit IBindingList on your datasource. On Databind.

Loop and bind this way Instead, is easier in my opinion.

        dg_Transactions.Columns.Add("1", "Date");
        dg_Transactions.Columns.Add("2", "Amount");
        dg_Transactions.Columns.Add("3", "Description");

        foreach (var row in data.Transactions)
        {
            var n = dg_Transactions.Rows.Add();

            var i = 0;
            dg_Transactions.Rows[n].Cells[i++].Value = row.Date;;
            dg_Transactions.Rows[n].Cells[i++].Value = row.Amount;
            dg_Transactions.Rows[n].Cells[i++].Value = row.Description;
        }