Найти и найти далее - PullRequest
       3

Найти и найти далее

1 голос
/ 24 ноября 2011

Я использую две формы, одна из которых представляет собой текстовый редактор с меню и форматированным текстовым полем, а вторая форма предназначена для поиска и замены и содержит четыре кнопки и два текстовых поля. Мне удалось сделать кнопку поиска, но у меня возникли проблемы с Find Next. Я использую C # Windows Forms.

Вот код, который я использую для поиска:

private void button1_Click(object sender, EventArgs e)
    {
        RichTextBox frm1TB = ((Form1)this.Owner).txtDisplay;

        int foundAt = frm1TB.Text.IndexOf(searchText.Text);

        if (foundAt == -1)
        {
            MessageBox.Show("Not Found");
        }
        else
        {
            frm1TB.SelectionStart = foundAt;
            frm1TB.SelectionLength = searchText.TextLength;
            frm1TB.Focus();

        }
    }

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Найти следующий будет что-то вроде следующего:

if (frm1TB.Text.Length >= frm1TB.Text.SelectionStart + frm1TB.Text.SelectionLength)
{
    int foundAt = frm1TB.Text.IndexOf(
        searchText.Text,
        frm1TB.Text.SelectionStart + frm1TB.Text.SelectionLength);
}
1 голос
/ 24 ноября 2011

Вам нужно запомнить индекс, по которому вы нашли свою предыдущую запись (или даже лучше, с которой вы должны начать найти следующий поиск), а затем просто использовать IndexOf(string, int) перегрузку,который позволяет начать поиск с указанной позиции.Во-первых, просто добавьте поле следующего индекса поиска в свой класс:

private int nextSearchStartIndex;

Теперь ваш метод Find должен постоянно обновлять этот индекс:

if (foundAt == -1)
{
    this.nextSearchStartIndex = 0;
    MessageBox.Show("Not Found");
}
else
{
    this.nextSearchStartIndex = foundAt + searchText.TextLength;
    // ...
}

И FindNext становится тривиальным:

// ...
var foundAt = frm1TB.Text.IndexOf(searchText.Text, 
    this.nextSearchStartIndex);
// Here you can use exactly same update index logic as in Find
0 голосов
/ 24 ноября 2011

Вы не можете использовать метод IndexOf () для этого, вам нужно переключиться на регулярные выражения.

Вот пример, как вы можете легко получить все записи поиска в RichtBox.Text:

using System.Text.RegularExpressions;

Regex re = new System.Text.RegularExpressions.Regex(searchText.Text.ToString(),RegexOptions.None);
MatchCollection mc = re.Matches(frm1TB.Text.ToString());
foreach (var ma in mc)
{

//do what you want
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...