查找并查找下一个

时间:2011-11-24 13:40:34

标签: c# winforms

我使用两种形式,其中一种是带有菜单和富文本框的富文本编辑器,第二种形式用于搜索和替换,包含四个按钮和两个文本框。我已设法执行查找按钮,但我遇到了查找下一个问题。我正在使用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 个答案:

答案 0 :(得分:1)

查找下一个将如下所示:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你不能使用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
}