如何在网格视图中将字符串列排序为日期-时间列



我想将网格视图中的列排序为datetime,但我觉得它是按字符串排序的:

我的代码:

if (SortExpression.ToString() == "TransDate")
{
    if (SortDirection == SortDirection.Ascending)
    {
        gv_Details1.DataSource = TransactionList.OrderBy(t =>  DateTime.Parse(t.TransDate)).ToList<UserTransactionDTO>();
    }
    else
    {
        gv_Details1.DataSource = TransactionList.OrderByDescending(t => DateTime.Parse(t.TransDate)).ToList<UserTransactionDTO>();
    }
}

我的aspx:

   <asp:BoundField DataField="TransDate" HeaderText="Date" SortExpression="TransDate">

部分结果::

23/12/2012 09:51
27/9/2012 11:36
3/10/2012 12:28
2/10/2012 10:51

我认为问题是在linq排序中使用DateTime.Parse,并且字符串的第一部分和第二部分可能是日期或月份。。。请记住,解析是逐项进行的,所以第一个解析方式并不意味着第二个解析方式相同。

您的区域默认值可能是第一个月,这对第一对夫妇不起作用,所以它知道第一部分是天,所以它使用这种格式。对于最后几次约会,第一部分确实适用于month,因此它按照默认值首先解析month。反之亦然:)

尝试像这样使用DateTime.ParseExact

CultureInfo provider = CultureInfo.InvariantCulture;
string format = "dd/MM/yyyy hh:mm";
gv_Details1.DataSource = TransactionList.
    OrderBy(t =>  DateTime.ParseExact(t.TransDate, format, provider)).
    ToList<UserTransactionDTO>();

希望我选择了正确的格式,但如果不只是调整它的话。

结果看起来不像是按字符串排序的…下面是一个使用字符串解析和列表进行正确排序的快速示例

static void Main(string[] args)
{
    List<String> datestrings = new List<string>()
    {
        "12/23/2012 09:51",
        "9/27/2012 11:36",
        "10/2/2012 12:28",
        "10/3/2012 10:51"
    };
    List<DateTime> dates = datestrings.Select(a => DateTime.Parse(a)).OrderBy(a => a).ToList();
    foreach (var d in dates)
    {
        Console.WriteLine(d);
    }
    Console.ReadLine();
}

以上内容对字符串进行了适当的排序。

我首先要确保在您出于某种原因设置数据集后,网格不会重新排序,方法是将TransactionList.OrderBy(t => Da...存储在临时变量中,并在设置数据源之前确保其排序正确。

我接下来会检查一下你的日期是否有文化问题(或者使用ParseExact)(尽管你在当前订单中发送的内容没有让我感到惊讶)。

最后,我还没有跟上asp绑定的速度,但也许绑定到数据集的方式需要您指定日期,就像下面的链接所回避的那样:http://forums.asp.net/t/1001482.aspx/1

该网站的一段摘录推荐:

< asp:boundfield datafield="Your_Date_Column" dataformatstring="{0:MMMM d, yyyy}" htmlencode="false" />

当我只通过SQL执行时,我在网格视图附带的T-SQL代码中添加了一个"order by"语句。

相关内容

  • 没有找到相关文章