Как отсортировать столбец DataGridView (связанный с BindingSource) по дате? - PullRequest
5 голосов
/ 02 марта 2012

У меня есть DataGridView, в котором, среди прочего, есть столбцы, содержащие даты. К сожалению, даты имеют формат ДД.ММ.ГГГГ, а все значение находится в 1 столбце, что является распространенным форматом даты в Европе. DGV привязан к BindingSource, который способен сортировать и выполнять расширенную сортировку.

Проблема заключается в следующем: если я просто использую стандартную сортировку DGV, даты отображаются в виде строк (они отображаются в DataGridViewTextBoxColumn) и, таким образом, сортируются по дню-> месяц-> году, но, конечно, я хотел бы с точностью до наоборот; Я хочу, чтобы они отсортированы в хронологическом порядке.

Итак, есть ли способ отсортировать эти столбцы так, как я хочу?

  • Самый простой способ - использовать SortCompare. событие DGV, но, видимо, это невозможно сделать, если DGV привязан к DataSoruce.
  • Конечно, я использовал Google и всегда получаю решение "использовать свойство Sort для расширенной сортировки". BindingSource, связанный с DGV, действительно поддерживает сортировку и расширенную сортировку, но, насколько я понимаю, это просто дает мне возможность, например, сортировать по нескольким столбцам и не дает возможности сделать так, чтобы сортировка столбца даты осуществлялась по году -> месяцу -> дню (или, в более общих чертах, позволяет реализовать функцию сравнения). Или я что-то упустил?

Какие варианты у меня есть, чтобы достичь того, чего я хочу? При объяснении, пожалуйста, имейте в виду, что я - не новичок в программировании - новичок в этом материале Windows Forms.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 августа 2013
private void DataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Name == "YourColumnName") //<== this must be your date column name
    {
        DateTime dt1 = Convert.ToDateTime(e.CellValue1);
        DateTime dt2 = Convert.ToDateTime(e.CellValue2);
        e.SortResult = System.DateTime.Compare(dt1, dt2);
        e.Handled = true;
    }
}
0 голосов
/ 02 марта 2012

Может быть, этот код даст вам идею.Сначала я настраиваю данные:

DataTable dt = new DataTable();
dt.Columns.Add("DateOfBirth", typeof(DateTime));

dt.Rows.Add(new DateTime(1981, 10, 29));
dt.Rows.Add(new DateTime(1984, 8, 12));
dt.Rows.Add(new DateTime(1982, 9, 7));

bindingSource1.DataSource = dt;
dataGridView1.DataSource = bindingSource1;
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;

Теперь с помощью ColumnHeaderMouseClick мы выполним сортировку по первому столбцу:

private SortOrder _sortDirection;

    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
        if (e.ColumnIndex == 0) {
            string sort = string.Empty;
            switch (_sortDirection) {
                case SortOrder.None:
                    _sortDirection = SortOrder.Ascending;
                    sort = "asc";
                    break;
                case SortOrder.Ascending:
                    _sortDirection = SortOrder.Descending;
                    sort = "desc";
                    break;
                case SortOrder.Descending:
                    _sortDirection = SortOrder.None;
                    sort = string.Empty;
                    break;
            }

            dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = _sortDirection;
            if (!string.IsNullOrEmpty(sort)) {
                bindingSource1.Sort = "DateOfBirth " + sort;
            } else {
                bindingSource1.RemoveSort();
            }
        }
    }

Надеюсь, это поможет!

...