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