我尝试将DataView
RowFilter
用于DataType为“TimeSpan”的列,如下所示:
dv.RowFilter = ("Convert([time],System.String) LIKE '17:12:00'")
我发现搜索参数"%17% or %12%
,对于双Zeros我必须使用一个:%0%,工作正常,现在我不确定Convert(timespan, System.String)
格式.. ......
我知道TimeSpan
有一个特殊格式,如(17,12,0)
或{17}{12}{0}
,但作为未指定的转换为字符串,它应该是:hh:mm:ss
,如timespan.ToString()
- 但使用DataView's
RowFilter我无法使其工作!
我正在使用Visual Studio 2008 Pro和.NET 3.5。
答案 0 :(得分:1)
问题在于转换为字符串。它生成一个以非常奇怪的方式格式化的字符串。为了说明,让我们使用这个C#代码创建一个表:
var table = new DataTable();
table.Columns.Add("span", typeof(TimeSpan));
table.Rows.Add(new object[] { new TimeSpan(1, 2, 3) });
table.Rows.Add(new object[] { new TimeSpan(4, 5, 6) });
table.Columns.Add("asstring");
table.Columns["asstring"].Expression = "Convert(span, 'System.String')";
将它分配给网格控件后,它将如下所示:
在微软自己的文档中,他们会查看Expression
文档,了解Convert(span, 'System.String')
在RowFilter
中的工作原理。这意味着它将TimeSpan转换为您在屏幕截图中看到的内容 - 01:02:03
变为PT1H2M3S
。
答案 1 :(得分:0)
将所有内容组合在一起,可以使用以下方法为特定值过滤TimeSpan
中DataTable
类型的列。背后的想法是将存储的TimeSpan
动态转换为其“数据库”字符串表示形式,这又使您能够在将其转换为TimeSpan
值后立即对其进行选择以进行字符串比较“数据库”字符串表示形式。
创建TimeSpan
值的“数据库”字符串表示形式时,需要特别注意具有零值的时间段。可以通过以下模式来描述它的规范:
PT[<hours>H][<minutes>M]<seconds>[.<fraction>]S
其中<fraction>
表示十分之一秒,请参阅MSDN文档的“自定义TimeSpan格式字符串”。除秒以外,具有零值的时间段需要省略。同样,小数部分应不包含任何结尾的零数字。最后,该字符串用前缀PT
和后缀S
括起来。
这将导致以下格式字符串创建正确的“数据库”字符串表示形式:
TimeSpan oTimeSpan; // TimeSpan value of your choice
string strTimeSpan =
string.Format("PT{0}{1}{2}{3}S",
(oTimeSpan.Hours == 0
? ""
: string.Format("{0:%h}H", oTimeSpan)),
(oTimeSpan.Minutes == 0
? ""
: string.Format("{0:%m}M", oTimeSpan)),
string.Format("{0:%s}", oTimeSpan),
string.Format(".{0:fffffff}", oTimeSpan).TrimEnd('0', '.'))
现在可以过滤TimeSpan
中类型为DataTable
的列string strExpr =
"Convert([ColumnName], '" + typeof(string).ToString() + "')"
+ "='" + strTimeSpan + "'";
以获取某些值的表达式:
ColumnName
其中DataTable
是指包含TimeSpan
值的{{1}}列的名称。
请注意,此方法基于字符串比较,因此,只有比较相等才能提供可靠的结果。其他比较运算(例如“大于”或“小于”)很可能会产生意外结果。