查找和查找下一个

本文关键字:查找 下一个 | 更新日期: 2023-09-27 18:15:43

我使用两个表单,其中一个是带菜单和富文本框的富文本编辑器,第二个表单用于搜索和替换,包含四个按钮和两个文本框。我已经设法做找到按钮,但我有问题,找到下一步。我正在使用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();
        }
    }

查找和查找下一个

查找下面的内容:

if (frm1TB.Text.Length >= frm1TB.Text.SelectionStart + frm1TB.Text.SelectionLength)
{
    int foundAt = frm1TB.Text.IndexOf(
        searchText.Text,
        frm1TB.Text.SelectionStart + frm1TB.Text.SelectionLength);
}

您需要记住您找到上一个条目的索引(或者更好的是,您应该开始查找下一个搜索),然后简单地使用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

你不能使用IndexOf()方法,你必须切换到正则表达式

这是一个如何在richbox中轻松获取所有搜索条目的示例。文本:

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
}