我想在网格视图中订购一个列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>();
}
}
<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
答案 0 :(得分:3)
我认为问题是你在linq排序中使用DateTime.Parse
而你的字符串有第一和第二部分可能是白天或月份的情况......记住解析是逐项进行的,所以只是因为第一个解析单向并不意味着第二个解析方式相同。
您的区域默认值可能是第一个月,这对第一对夫妇不起作用,因此它知道第一部分是一天,因此它使用该格式。对于最后几个日期,第一部分确实适用于月份,因此它根据默认值首先解析月份。反之亦然:)
尝试使用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>();
希望我选择了正确的格式,但如果不是只是调整它。
答案 1 :(得分:2)
结果看起来不是字符串命令给我...下面是一个使用字符串解析和列表正确排序的快速示例
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绑定的速度,但也许你绑定到teh数据集的方式要求你指定它的日期类似于以下链接:http://forums.asp.net/t/1001482.aspx/1
该网站的摘录建议:
< asp:boundfield datafield="Your_Date_Column" dataformatstring="{0:MMMM d, yyyy}" htmlencode="false" />
答案 2 :(得分:0)
当我仅通过SQL执行此操作时,我将“order by”语句添加到附加到网格视图的T-SQL代码中。