Вопрос

I am trying to filter a numeric string by matching the start of the source string and the length of the search string.

All the filtered columns are strings. Most are just words, but there is one column that has values that look like this 001302:Alt#. The underlying data source sucks, but I cannot change the structure. The numbers are grouped based on the left-hand values (i.e. 050110 and 050534 are both related to client(05), 052123 is related to client(05) invoices(2)). My users want to be able to search the data in the DataGridView and filter that column by group (i.e. Enter 05 and see everything that starts with 05, or 052 and see 052000-052999)

I am generating the filter string and setting the Filter property on the BindingSource using the DataSet as DataSource and the Table as DataMember. The rest of my filtering works, the only problem I am having is with the numeric filter. When I set the BindingSource.Filter property, it throws an ArgumentOutOfRange exception.

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Data.dll Additional information: Substring() argument is out of range.

I thought I might be firing this against an empty row, or one that only had a few digits, but it is firing with only one character. Therefore, the length argument should be valid, but it is still throwing the exception.

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));
            }
    }
}

I am sure I am just missing something stupid. I thank you in advance for pointing out my error(s)!

Это было полезно?

Решение

I was making the assumption that the DataColumn Expression SUBSTRING behaved the same as String.Substring. However, the SUBSTRING Expression is a 1 based index, whereas the String.Substring method starts its index at 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top