DataGridView DateTime列排序异常问题求助
解决DataGridView手动创建DateTime列后排序异常的问题
看起来你已经做了不少铺垫工作——识别DateTime列、设置单元格显示格式、指定ValueType,但排序还是出问题了,核心原因大概率是你给单元格赋值的还是字符串,而非真正的DateTime对象。哪怕设置了ValueType = typeof(DateTime),DataGridView排序时还是会按字符串的规则来比较,自然会出现乱序的情况。
咱们一步步来修正:
1. 先修正日期格式检测的逻辑
你当前的循环会遍历所有格式,最后匹配到的格式会覆盖之前的结果,可能导致finalDateFormat不是最适配的那个;而且没找到匹配格式时也没重置变量,容易引发后续错误。建议找到第一个匹配的格式就跳出循环:
string[] formats = {"M/d/yyyy", "MM/dd/yyyy", "d/M/yyyy", "dd/MM/yyyy", "yyyy/M/d", "yyyy/MM/dd", "M-d-yyyy", "MM-dd-yyyy", "d-M-yyyy", "dd-MM-yyyy", "yyyy-M-d", "yyyy-MM-dd", "M.d.yyyy", "MM.dd.yyyy", "d.M.yyyy", "dd.MM.yyyy", "yyyy.M.d", "yyyy.MM.dd", "M,d,yyyy", "MM,dd,yyyy", "d,M,yyyy", "dd,MM,yyyy", "yyyy,M,d", "yyyy,MM,dd", "M d yyyy", "MM dd yyyy", "d M yyyy", "dd MM yyyy", "yyyy M d", "yyyy MM dd", "dd MMMM yyyy", "dd MMM yy" }; List<string> _columnList = new List<string>(); List<HtmlNode> _descList = new List<HtmlNode>(); DateTime date; GetResultsDecendants(_descList, targetNode); foreach( var _desc in _descList) { finalDateFormat = null; // 每次循环重置格式变量 foreach( string dtFormat in formats) { if(DateTime.TryParseExact(_desc.InnerText, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { finalDateFormat = dtFormat; break; // 找到匹配格式就跳出,避免被后续格式覆盖 } } if (finalDateFormat != null) { _columnList.Add(_desc.Name+" -Date"); } else { _columnList.Add(_desc.Name); } }
2. 给单元格赋值时,要存储DateTime对象而非字符串
你之前的代码只是设置了ValueType,但Value还是字符串类型。字符串的排序逻辑和DateTime完全不同(比如"10/05/2024"作为字符串会排在"09/20/2024"后面,但作为日期前者更晚)。修改赋值逻辑:
if (colList[colindex].Contains("Date")) { DateTime cellDate; // 用之前确定的格式把字符串解析成DateTime对象 if(DateTime.TryParseExact(listItem.InnerText, finalDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out cellDate)){ dgvRow.Cells.Add(new DataGridViewTextBoxCell() { Value = cellDate, // 存储DateTime对象 ValueType = typeof(DateTime) }); } else { // 处理解析失败的情况,比如存null或原字符串 dgvRow.Cells.Add(new DataGridViewTextBoxCell() { Value = listItem.InnerText, ValueType = typeof(string) }); } } else { // 非日期列的赋值逻辑 dgvRow.Cells.Add(new DataGridViewTextBoxCell() { Value = listItem.InnerText }); }
3. 确保列的排序模式正确
创建日期列时,把SortMode设置为Automatic,让DataGridView自动基于单元格值的类型处理排序:
// 示例:创建日期列时的配置 DataGridViewColumn dateColumn = new DataGridViewTextBoxColumn(); dateColumn.Name = colHasDate; dateColumn.DefaultCellStyle.Format = finalDateFormat; dateColumn.SortMode = DataGridViewColumnSortMode.Automatic; // 开启自动排序逻辑 dataGridView.Columns.Add(dateColumn);
这样修改后,DataGridView排序时会基于DateTime对象的时间顺序来比较,就能得到符合预期的排序结果了。
内容的提问来源于stack exchange,提问作者evans
相关产品推荐
相关产品推荐

