我想将网格视图中的列排序为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"语句。