2014-04-14 4 views
0

원본 문자열의 시작과 검색 문자열의 길이를 일치시켜 숫자 문자열을 필터링하려고합니다.DataColumn에서 BindingSource와 함께 'SUBSTRING (expression, startIndex, length)'사용

필터링 된 모든 열은 문자열입니다. 대부분은 단어 일 뿐이며, 001302:Alt#과 같은 값을 가진 열이 하나 있습니다. 기본 데이터 소스는 엉망이지만 구조를 변경할 수는 없습니다. 숫자는 왼쪽 값에 따라 그룹화됩니다. 즉 050110050534은 모두 클라이언트 (05)와 관련이 있으며 052123은 클라이언트 (05) 송장 (2)과 관련됩니다. 내 사용자는 DataGridView의 데이터를 검색하고 그룹별로 해당 열을 필터링 할 수 있기를 원합니다. 05를 입력하고 05 또는 052로 시작하여 052000-052999를 참조하십시오.

필터 문자열을 생성 중입니다. BindingSource의 DataSet을 DataSource로, Table을 DataMember로 사용하여 BindingSource의 Filter 속성을 설정합니다. 나머지 필터링 작업은 숫자 필터를 사용하는 것만 큼 문제가됩니다. BindingSource.Filter 속성을 설정하면 ArgumentOutOfRange 예외가 발생합니다.

'System.ArgumentOutOfRangeException이' 는 추가 정보가 system.data.dll 발생 유형의 처리되지 않은 예외 : 문자열을() 인수 범위 밖이다.

빈 행 또는 몇 자리 숫자가있는 행에 대해이 문제를 발생시킬 수 있다고 생각했지만 단 한 문자로만 실행됩니다. 따라서 length 인수는 유효해야하지만 여전히 예외가 발생합니다.

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

나는 바보 같은 것을 놓친 것 같습니다. 제 실수를 지적 해 주셔서 미리 감사드립니다!

답변

2

신경 쓰지 마세요. DataColumn Expression SUBSTRING이 String.Substring과 같은 동작을한다고 가정합니다. 그러나 SUBSTRING 표현식은 1 기반 인덱스입니다. String.Substring 메서드는 0에서 인덱스를 시작하지만, 먼저 체크해야했지만 시간이 지나면 벽돌 벽을 실행하려고 시도했습니다.

감사합니다.