如何用DataView RowFilter筛选当前时间后的XML日历事件
解决DataView筛选当前时间之后日历事件的问题
问题分析
你之前的写法存在两个关键问题:
- 语法错误:RowFilter字符串未正确闭合,且不能在筛选表达式中直接调用
DateTime.Now.ToString()这类C#方法,需要先将当前时间格式化为符合OLE DB规则的字符串再嵌入表达式。 - 逻辑缺陷:仅比较
StartTime会忽略日期维度,比如昨天的事件即使时间晚于当前时间,也不应被筛选出来。
正确的筛选方案
以下两种方法均可实现筛选Room 1中当前时间之后的事件:
方法1:组合日期与时间成完整DateTime比较
将StartDate和StartTime合并为完整的事件开始时间,再与当前时间对比:
// 格式化当前时间为OLE DB认可的日期时间格式(MM/dd/yyyy HH:mm) string currentDateTime = DateTime.Now.ToString("MM/dd/yyyy HH:mm"); // 构造RowFilter表达式:先筛选Room 1,再判断事件开始时间晚于当前时间 dv.RowFilter = $"Location='Room 1' AND (CDate(StartDate) + CDate(StartTime)) > #{currentDateTime}#";
CDate():将字符串类型的日期/时间转换为日期时间类型#:OLE DB表达式中用于包裹日期时间值的符号
方法2:分日期和时间分步判断
先判断事件日期是否晚于今天,若日期等于今天则再判断时间是否晚于当前时间:
string currentDate = DateTime.Now.ToString("MM/dd/yyyy"); string currentTime = DateTime.Now.ToString("HH:mm"); dv.RowFilter = $"Location='Room 1' AND (CDate(StartDate) > #{currentDate}# OR (CDate(StartDate) = #{currentDate}# AND StartTime > '{currentTime}'))";
这种方式逻辑更直观,适合需要单独处理日期/时间场景的情况。
内容的提问来源于stack exchange,提问作者bickyz
相关产品推荐
相关产品推荐

