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