C#:Winforms应用程序中按日期字段排序

C#:Winforms应用程序中按日期字段排序,c#,winforms,C#,Winforms,在sqlite数据库中,我将日期字段存储为文本属性,格式如下: dd/mm/yyyy hh:mm:ss (例如,字段中的文本看起来像:28/04/2009 19:15:17) 我已经通过VS2008中的GUI将DataGridView绑定到数据库。所以基本上所有的代码都是为我自动生成的。当我启动应用程序时,它读取数据库并显示DataGridView中的所有行。我可以对除日期列以外的所有列进行排序。我怀疑这是因为DataGridView认为date列只是纯文本。我怎样才能让它按我所希望的那样工作

在sqlite数据库中,我将日期字段存储为文本属性,格式如下:

dd/mm/yyyy hh:mm:ss
(例如,字段中的文本看起来像:28/04/2009 19:15:17)

我已经通过VS2008中的GUI将DataGridView绑定到数据库。所以基本上所有的代码都是为我自动生成的。当我启动应用程序时,它读取数据库并显示DataGridView中的所有行。我可以对除日期列以外的所有列进行排序。我怀疑这是因为DataGridView认为date列只是纯文本。我怎样才能让它按我所希望的那样工作

更新

据我所知,sqlite中没有日期类型,所以我必须存储为文本。不过我很高兴被告知不是这样

更新 用户希望查看dd/mm/yyyy格式的日期


谢谢。

如果您将日期视为字符串,并且希望它作为字符串正确排序,则应将日期格式更改为
yyyy/mm/dd hh:mm:ss
,这将使日期字符串可排序。理想情况下,您当然应该将数据类型视为日期。

如果您将日期视为字符串,并且希望它作为字符串正确排序,则应将日期格式更改为
yyyy/mm/dd hh:mm:ss
,这将使日期字符串可排序。理想情况下,您当然应该将数据类型视为日期。

我将执行以下操作之一(按优先顺序):

  • 更改数据库,使其将日期值存储为
    date
    类型,而不是字符串。这是“正确的做法”,因为您将能够在所有级别上应用排序而不会出现任何问题。它可能更节省空间,因为日期类型的大小通常只有几个字节
  • 如果无法更改数据库设计,请将存储日期文本的格式更改为格式(
    yyyy-MM-dd HH:MM:ss
  • 在数据库和网格之间创建一个层,将数据读入自定义对象,其中日期值由
    DateTime
    字段表示。使用
    DateTime.TryParseExact
    将数据库中的字符串解析为自定义对象
  • 我会做其中一个(按优先顺序):

  • 更改数据库,使其将日期值存储为
    date
    类型,而不是字符串。这是“正确的做法”,因为您将能够在所有级别上应用排序而不会出现任何问题。它可能更节省空间,因为日期类型的大小通常只有几个字节
  • 如果无法更改数据库设计,请将存储日期文本的格式更改为格式(
    yyyy-MM-dd HH:MM:ss
  • 在数据库和网格之间创建一个层,将数据读入自定义对象,其中日期值由
    DateTime
    字段表示。使用
    DateTime.TryParseExact
    将数据库中的字符串解析为自定义对象

  • 您可以在internet上找到SortableBindingList的许多实现,包括一个来自MSDN的实现。这个博客可能会有所帮助。您可以使用已知的数据类型并获得正确的排序,而不必太担心日期格式字符串。唯一的要求是将数据库中的日期字符串转换为绑定对象类型中的日期时间。

    可以在internet上找到许多SortableBindingList实现,包括MSDN中的一个。这个博客可能会有所帮助。您可以使用已知的数据类型并获得正确的排序,而不必太担心日期格式字符串。唯一的要求是将数据库中的日期字符串转换为绑定对象类型中的日期时间。

    是的,我认为是这样,但即使是字符串,也可以通过单击标题对其进行排序。您在数据库中使用了什么类型是的,我认为是这样,但即使是字符串,也可以通过单击标题对其进行排序。您在dbI中使用了什么类型我会建议做3,不管2是否完成。我对Winforms编程非常陌生。请问有没有关于3点的例子?我不知道从哪里开始。我建议做3,不管2是否完成。我对Winforms编程非常陌生。请问有没有关于3点的例子?我不知道从何处开始。谢谢,但是否仍可以将其作为dd/mm/yyyy hh:mm:ss呈现给用户,因为这是他们喜欢的?嗯,我没有广泛使用datagrid,但是,如果可以为网格提供自定义排序,则可以以表示格式显示日期,并通过使用DateTime.ParseExact(例如)将日期解析为DateTime实例来执行排序,然后对日期类型进行比较。由于数据库不支持日期数据类型,您还可以考虑将日期解析为一个类型安全的对象,该对象将日期表示为DATE时间,这将允许您一旦在.NET侧出现日期,就以类型安全的方式处理日期。谢谢,但是否仍然可以将其呈现给用户作为DD/MM/YYYY HH:MM:SS,因为这是他们更喜欢的吗?我没有广泛使用datagrid,但是,如果可以为网格提供自定义排序,则可以以表示格式显示日期,并通过使用DateTime.ParseExact(例如)将日期解析为DateTime实例来执行排序,然后对日期类型进行比较。由于数据库不支持日期数据类型,您还可以考虑将日期解析为类型安全的对象,该对象将日期表示为DATE时间,这将允许您在.NET侧出现时,以类型安全的方式处理日期。谢谢。这看起来很棒。这就是@Fredrik Mörk的答案中的#3吗?是的。我在许多应用程序中使用了SortableBindingList的修改版本。我通常将数据库数据读入