0

我正在尝试通过匹配源字符串的开头和搜索字符串的长度来过滤数字字符串。

所有过滤的列都是字符串。大多数只是单词,但有一列的值看起来像这样001302:Alt#。底层数据源很烂,但我无法更改结构。这些数字根据左侧的值进行分组(即都与 client(05) 相关050110050534052123相关,与客户 (05) 发票 (2) 相关)。我的用户希望能够在 DataGridView 中搜索数据并按组过滤该列(即输入 05 并查看以 05 开头的所有内容,或 052 并查看 052000-052999)

我正在生成过滤器字符串并使用 DataSet 作为 DataSource 和 Table 作为 DataMember 在 BindingSource 上设置 Filter 属性。我的其余过滤工作,我遇到的唯一问题是数字过滤器。当我设置BindingSource.Filter属性时,它会引发ArgumentOutOfRange异常。

System.Data.dll 中出现“System.ArgumentOutOfRangeException”类型的未处理异常附加信息:Substring() 参数超出范围。

我想我可能会在空行或只有几个数字的行上触发它,但它只用一个字符触发。因此,长度参数应该是有效的,但它仍然抛出异常。

bool firstColumn = true;
foreach (DataColumn column in FilteredColumns.Keys)
{
    if (FilteredColumns[column])
    {
        if (!firstColumn) fieldFilter.Append(") OR ("); else firstColumn = false;

        int numericFilter;
        if (int.TryParse(filterWord, out numericFilter))
        {
            fieldFilter.Append(String.Format("SUBSTRING({0}, 0, {2}) = {1}", column.ColumnName, filterWord, filterWord.Length));
        }
        else
            {
            fieldFilter.Append(String.Format("{0} like '%{1}%'", column.ColumnName, filterWord));
            }
    }
}

我确定我只是错过了一些愚蠢的东西。我提前感谢您指出我的错误!

4

1 回答 1

4

我假设 DataColumn 表达式SUBSTRING的行为与String.Substring. 但是,SUBSTRINGExpression 是基于 1 的索引,而该String.Substring方法的索引从 0 开始。

于 2014-04-15T02:19:08.453 回答