2014-11-13 2 views
0

메모장으로 이동하십시오. "이 테스트는 테스트입니다."라고 입력하십시오. 텍스트 맨 끝에 캐럿을 넣으십시오. 편집 -> 찾기 -> 유형 "is"-> 방향을 '위로'로 설정하십시오.요청한 텍스트를 거꾸로 검색하는 방법?

각 유형에서 '다음 찾기'를 클릭하면 캐럿 이전의 'is'가 선택됩니다. 그런 다음 다음에 "찾기"를 입력하면 이전의 "is"가 선택됩니다.

어떻게하면 WinForm의 텍스트 상자를 사용하여 비슷한 방식으로 코드에서이 작업을 수행 할 수 있습니까? 나는 특정 문자열을 뒤로 검색하는 방법을 실제로 이해하지 못하고있다. 감사.

답변

2

String.LastIndexOf(string value, int startIndex) 메서드를 사용하십시오.

이 방법은 문자열의 문자 위치 인 startIndex에서 검색을 시작하고 value이 발견되거나 첫 번째 문자 위치가 검사 될 때까지 처음으로 뒤로 이동합니다.

0

실제 검색 상자가 구현되어 있으므로이 코드를 사용하면 도움이 될 것입니다. 이는 현재 커서 위치, 대소 문자 구분, 앞으로/뒤로 검색 등 메모장 검색 옵션을 완전히 에뮬레이션합니다. 파일의 시작 부분으로 자동 줄 바꿈을 수행 한 다음 커서 앞의 텍스트를 검색합니다 (역방향 검색의 경우 반대).

protected Int32 DoSearch(ref String sourceText, String findText, Int32 searchStartPos, StringComparison sc, Boolean forward) 
    { 
     Int32 resultPos = -1; 
     if (forward) 
     { 
      // Makes sure that if the cursor is currently ON a result, then the next result is found. 
      // Not needed for backwards search, since you search before the current position in that case. 
      if (sourceText.Length - findText.Length >= searchStartPos && findText.Equals(sourceText.Substring(searchStartPos, findText.Length), sc)) 
       searchStartPos++; 

      resultPos = sourceText.IndexOf(findText, searchStartPos, sc); 
      if (resultPos == -1) 
       resultPos = sourceText.IndexOf(findText, 0, searchStartPos, sc); 
     } 
     else 
     { 
      resultPos = sourceText.LastIndexOf(findText, searchStartPos, sc); 
      if (resultPos == -1) 
      { 
       Int32 start = sourceText.Length; 
       Int32 length = start - searchStartPos; 
       resultPos = sourceText.LastIndexOf(findText, start, length, sc); 
      } 
     } 
     return resultPos; 
    } 

참고 sourceText 의해 참조 정상적인 문자열 변수가 여기에 시간의 총 폐기물이 함수 호출에 복사 될 수 있기 때문에 순수하게 처리된다; 텍스트가 다소 클 수 있으며이 함수는 문자열을 수정하지 않으므로 포인터를 전달하는 것이 나에게 더 효율적으로 보입니다.

이 (내 전체 코드에서이 더 TextChanged 이벤트 텍스트를 다시 가져올 수 텍스트 상자에서 있었다 여부를 평가하여 내 검색 창 코드의 나머지 부분에서 최적화 된)

이 검색은 일반적으로 다음입니다 그 다음에 해당 부분을 코드로 선택하고, 반환 된 resultPos을 선택 시작으로 사용하고 findText.Length을 선택 길이로 사용합니다.

관련 문제