【问题标题】:DataTable.DefaultView.Sort not sorting properly when sort by DateTime Column按日期时间列排序时,DataTable.DefaultView.Sort 排序不正确
【发布时间】:2015-05-02 17:48:20
【问题描述】:

我有一个数据表,其中有如下四列:

DataTable Quarters = new DataTable();
Quarters.Columns.Add("QuarterId", typeof(int));
Quarters.Columns.Add("Quarter");
Quarters.Columns.Add("StartDate", typeof(DateTime));
Quarters.Columns.Add("EndDate", typeof(DateTime));

使用代码填充数据后,我想根据类型为DateTime 的开始日期字段对数据表行进行排序。

为此,我编写了以下代码行:

Quarters.DefaultView.Sort = "StartDate";

但是在获得数据后,我没有得到正确的输出。日期被视为字符串。

我的数据排序后的输出如下(下图是监视窗口不是我的网格):

我应该怎么做才能使记录正确排序?

【问题讨论】:

  • 有很多选项 - 如果您在开始时进行一次排序 - 我建议在填充数据网格或其他任何内容之前对您的集合进行排序
  • Quarters = Quarters.DefaultView.ToTable() 在Quarters.DefaultView.Sort = "StartDate";之后使用这个
  • 你好@CodingDefined 它工作正常。您可以将其添加为答案,以便我可以标记为正确答案。非常感谢。

标签: c# asp.net sorting datetime datatable


【解决方案1】:

你是对的。我被另一个问题弄糊涂了。

为此工作人员创建一个新的类 CustomDateClass,它实现了 IComparable 接口并具有属性 DateProperty typeof(DateTime)

然后重写 CompareTo 方法来比较 DateTimePromerty。

public int CompareTo(object obj)
        {
            if (obj is CustomDateClass)
            {
                DateTime dt = ((CustomDateClass)obj).DateProperty;
                return dt.CompareTo(DateProperty);
            }
              throw new ArgumentException("not CustomDateClass");
        }

为您的 DataTable 更改 DateLine :

Quarters.Columns.Add("EndDate", typeof(CustomDateClass));

【讨论】:

  • 您确定吗?如果将其视为 DateTime 则 datagrid 将对其进行正确排序,文化无关紧要,我认为 DataGrid 正在将此 DateTime 解析为字符串,这就是导致问题的原因。我认为从这个 DataTable 创建集合并在这个集合中对其进行排序会更好。它会有额外的优势——绑定能力
  • @MajkeloDev 有什么进展吗?
【解决方案2】:

我会向你展示不同的(我认为正确的)方法。 首先让我们为这些数据创建一个类:

public class classNameGoesHere
{
    public int QuarterId { get; set; }
    public string Quarter{ get; set; }
    public DateTime StartDate{ get; set; }
    public DateTime EndDate{ get; set; }
}

现在,在您负责处理这些数据的班级中 - 让我们来处理这个问题。

首先创建一个你的数据类列表。

List<classNameGoesHere> listName = new List<classNameGoesHere>();

现在让我们用简单的 LinQ 查询填充这个列表。

listName = from x in Quarters.AsEnumerable()
           order by x.StartDate descending // sorting is beeing done here
           select new classNameGoesHere
           {
               QuarterId = x.field<int>("QuarterId"),
               Quarter = x.field<string>("Quarter"),
               StartDate = x.field<DateTime>("StartDate"),
               EndDate = x.field<DateTime>("EndDate")                  
           };

现在您可以将它绑定到您的 DataGrid.ItemsSource。 实际上,如果可能的话 - 最好在没有任何 DataTable 的情况下执行此操作。而不是 pulating DataTable - 将您的数据填充到我向您展示的列表中。(可能只是一点点重构代码)。 我希望它会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2016-08-09
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多