Как реализовать поиск по предыдущему в форме Windows для поиска ключевого слова в С#

У меня есть окно журнала в моем приложении С#. Я реализовал функцию поиска ключевого слова в форме, она ищет весь соответствующий текст в RichTextBox. Теперь я хочу создать функцию для поиска совпадений «Следующее» и «Предыдущее» в RichTextBox.

Код для FindNext

try
{
    if (start_search_point < log_textbox.Text.Length && start_search_point != -1)
    {
        log_textbox.SelectionBackColor = highlight_all_color;
        log_textbox.Find(search_keyword, start_search_point, RichTextBoxFinds.WholeWord);
        log_textbox.SelectionBackColor = Color.Honeydew;

        if (start_search_point + search_keyword.Length < log_textbox.Text.Length)
            start_search_point = log_textbox.Text.IndexOf(search_keyword, start_search_point + search_keyword.Length);
        else
            start_search_point = 0;
    }
    else
    {
        start_search_point = 0;
    }
}
catch (Exception ex)
{
    MDIParent.thisMdiObj.txtLog.Invoke(new Action(() => MDIParent.thisMdiObj.txtLog.AppendText(DateTime.Now.ToString() + " : " + ex.Message + "=>" + ex.StackTrace.ToString() + Environment.NewLine)));
}

Может ли кто-нибудь помочь мне с частью FindPrevious? Я не могу понять логику для этого.


person Biswarup Dass    schedule 15.06.2015    source источник


Ответы (1)


Как насчет создания MatchCollection и работы с ним?

MatchCollection matches = new Regex().Matches(search_keyword);

int currentIndex = 0;

А затем просто используйте currentIndex для получения элементов из вашей коллекции.

if(currentIndex > 0) --currentIndex;   // get previous search result
matches[currentIndex];

Пример: введите здесь описание изображения

person Fabjan    schedule 15.06.2015
comment
что будет содержать matches? Как он получит все совпадающие тексты из RichTextBox? @Фабьян - person Biswarup Dass; 15.06.2015
comment
Matches — это коллекция со всеми найденными совпадениями в тексте с использованием шаблона (в вашем случае просто ключевое слово), тогда как одиночное совпадение или Matches[i] содержит позицию индекса в тексте, где было найдено совпадение, сам текст совпадения и некоторую другую информацию; Чтобы «создать функцию для поиска следующего и предыдущего», вам просто нужно собрать их все в коллекцию и выполнить итерацию по ней. - person Fabjan; 15.06.2015
comment
Хорошо, я понял, что ты сказал. Позвольте мне попробовать этот метод. Но я не могу получить new Regex() Он показывает мне ошибку System.Text.RegularExpressions.Regex.Regex() недоступен из-за его уровня защиты. - person Biswarup Dass; 15.06.2015
comment
Это странно. Добавьте ссылку на свою библиотеку reg ex — с помощью System.Text.RegularExpressions; (к вашим операторам использования), затем просто введите MatchCollectionmatches = new Regex().Matches(search_keyword); - person Fabjan; 15.06.2015
comment
Да, я уже добавил ссылку на библиотеку using System.Text.RegularExpressions, поэтому я могу использовать MatchCollection. Но не Regex() - person Biswarup Dass; 15.06.2015
comment
Отредактировал мой ответ и добавил пример кода, проверьте его. Вы должны передать свое ключевое слово в Regex ctor в качестве параметра... - person Fabjan; 15.06.2015
comment
Эй, спасибо. Понятно. Дам вам знать через некоторое время, как я тестирую его. - person Biswarup Dass; 15.06.2015