在 DataColumn 上使用带有 BindingSource 的 'SUBSTRING(expression, startIndex, length)'

cha*_*ffe 0 c# expression datagridview filter datacolumn

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

所有过滤的列都是字符串。大多数只是单词,但有一列的值如下所示001302:Alt#。底层数据源很糟糕,但我无法改变结构。这些数字根据左侧值进行分组(即050110050534都与 client(05) 相关,052123与 client(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));
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

我确信我只是错过了一些愚蠢的事情。我预先感谢您指出我的错误!

cha*_*ffe 5

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