如何按日期对DataGridView列(绑定到BindingSource)进行排序

本文关键字:BindingSource 排序 绑定 日期 何按 DataGridView | 更新日期: 2023-09-27 18:26:37

我有一个DataGridView,其中有包含日期的列。不幸的是,日期的格式是DD.MM.YYYY,整个值在1列中,这是欧洲常见的日期格式。DGV绑定到BindingSource,BindingSource能够进行排序和高级排序。

问题如下:如果我只使用DGV的标准排序,日期将被视为字符串(它们显示在DataGridViewTextBoxColumn中),因此按天->月->年排序,但我当然希望完全相反;我想按时间顺序排列。

那么,有没有一种方法可以按照我希望的方式对这些列进行排序?

  • 到目前为止,最简单的方法是能够使用SortCompareDGV事件,但如果DGV被绑在一起,显然无法做到这一点到DataSorence
  • 当然,我使用了谷歌,我总是得到"使用排序属性进行高级排序"的解决方案。绑定到DGV的BindingSource确实支持排序和高级排序,但据我所知,这只是给了我一种可能性,例如按多列排序,而没有提供一种方法使其按年->月->日对日期列进行排序(或者更一般地说,允许我实现一种比较函数)。还是我错过了什么

我有什么选择来实现我想要的?在解释时,请记住,我虽然不是编程新手,但对Windows窗体的东西还是新手。

提前感谢!

如何按日期对DataGridView列(绑定到BindingSource)进行排序

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;
    }
}

也许这段代码会给你一个想法。首先我要设置数据:

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();
            }
        }
    }

希望这能有所帮助!