3

I try to use the DataView RowFilter for a column with DataType "TimeSpan" as following:

dv.RowFilter = ("Convert([time],System.String) LIKE '17:12:00'")

I've found that the search Parameter "%17% or %12%, for the double Zeros i have to use a single one: %0%, works fine, now im not sure about the Convert(timespan, System.String) Format... . I know that the TimeSpan have a Special Format like (17,12,0) or {17}{12}{0} but as a not specified convert to string it should be: hh:mm:ss like timespan.ToString() - but with the DataView's RowFilter i can't get this to work!

I'm using Visual Studio 2008 Pro with .NET 3.5.

4

2 回答 2

2

问题在于转换为字符串。它产生一个以非常奇怪的方式格式化的字符串。为了说明,让我们使用以下 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.

于 2016-10-27T13:39:47.777 回答
1

总而言之,您可以使用以下方法来过滤TimeSpanaDataTable中特定值的类型列。背后的想法是将存储TimeSpan的动态转换为其“数据库”字符串表示形式,这反过来又使您能够TimeSpan在将其转换为其“数据库”字符串表示形式后立即与您选择的值进行字符串比较。

创建值的“数据库”字符串表示TimeSpan需要特别注意具有零值的时间段。它的规范可以用以下模式来描述:

PT[<hours>H][<minutes>M]<seconds>[.<fraction>]S

其中<fraction>指的是百万分之一秒,请参阅 MSDN 文档的“自定义时间跨度格式字符串”。除秒外,需要省略具有零值的时间段。此外,小数部分预计不包含任何尾随零位。最后,字符串由前缀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为某些值过滤a中的类型列的表达式DataTable现在可以是:

string strExpr =
    "Convert([ColumnName], '" + typeof(string).ToString() + "')" 
    + "='" + strTimeSpan + "'";

其中ColumnName是指包含值的DataTable列的名称。TimeSpan

请注意,此方法基于字符串比较,因此,只有比较相等才能提供可靠的结果。其他比较操作,如“大于”或“小于”,很可能会产生意想不到的结果。

于 2019-05-30T14:55:07.517 回答