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

Yuk*_*Yuk 5 .net c# datagridview bindingsource winforms

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

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

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

  • 到目前为止,最简单的方法是能够使用DGV的SortCompare事件,但显然如果DGV绑定到DataSoruce则无法完成.
  • 当然我使用谷歌,我总是得到"使用排序属性进行高级排序"的解决方案.绑定到DGV的BindingSource确实支持排序和高级排序,但据我了解,这只是让我有可能按多列排序,并没有提供一种方法来按日排序日期列 - > month-> day(或更一般的术语允许我实现一种比较功能).或者我错过了什么?

我有什么选择可以实现我想要的?在解释时,请记住,我对这个Windows窗体的东西不熟悉编程.

提前致谢!

ion*_*den 0

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

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;
Run Code Online (Sandbox Code Playgroud)

现在使用 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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!