带有TimeSpan DataType的DataView RowFilter

时间:2013-01-25 20:58:23

标签: c# timespan dataview rowfilter

我尝试将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。

2 个答案:

答案 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')";

将它分配给网格控件后,它将如下所示:

enter image description here

在微软自己的文档中,他们会查看Expression文档,了解Convert(span, 'System.String')RowFilter中的工作原理。这意味着它将TimeSpan转换为您在屏幕截图中看到的内容 - 01:02:03变为PT1H2M3S

答案 1 :(得分:0)

将所有内容组合在一起,可以使用以下方法为特定值过滤TimeSpanDataTable类型的列。背后的想法是将存储的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}}列的名称。

请注意,此方法基于字符串比较,因此,只有比较相等才能提供可靠的结果。其他比较运算(例如“大于”或“小于”)很可能会产生意外结果。