欢迎光临

木子屋

标题: RichTextBox.Find遍历搜索字符串中的坑

作者: dnawo

日期: 2014-12-24 11:39 PM

分类: Win编程

内容: RichTextBox.Find遍历搜索字符串有两个重载方法可供调用：
复制内容到剪贴板 程序代码public int Find(string str, int start, RichTextBoxFinds options);
public int Find(string str, int start, int end, RichTextBoxFinds options);
经测试发现：在特定场合下这两个重载方法可能发生死循环，下面分别举栗说明。
例1：Find(string str, int start, RichTextBoxFinds options)重载
复制内容到剪贴板 程序代码int index = -1;
while ((index = richTextBox1.Find("屋", index + 1, RichTextBoxFinds.MatchCase)) != -1)
{
MessageBox.Show(index.ToString());
}
当richTextBox1.Text="木子屋"时，即搜索的字符串在最后一位时会发生死循环，MSDN没有说明start参数值等于RichTextBox.Text.Length时(大于会出错)会从头开始搜索。
例2：public int Find(string str, int start, int end, RichTextBoxFinds options)重载
复制内容到剪贴板 程序代码int index = -1;
while ((index = richTextBox1.Find("屋", index + 1, richTextBox1.Text.Length-1, RichTextBoxFinds.MatchCase)) != -1)
{
MessageBox.Show(index.ToString());
}
当richTextBox1.Text="木屋子"时，即搜索的字符串在倒数第二位时会发生死循环，这在MSDN有相关说明：
引用内容当给 start 和 end 参数提供相同的值时，就会搜索整个控件（正常搜索）。
若将end参数值改为-1，则又会出现例1的情况。
目前的解决方法是在循环内部加判断，出现上面栗子的情况时退出循环：
复制内容到剪贴板 程序代码int index = -1;
while ((index = richTextBox1.Find("屋", index + 1, RichTextBoxFinds.MatchCase)) != -1)
{
MessageBox.Show(index.ToString());
if (index + 1 == richTextBox1.Text.Length)
{
break;
}
}
相关链接
[1].RichTextBox.Find 方法 (String, Int32, RichTextBoxFinds)：http://msdn.microsoft.com/zh-cn/library/9be0980x(v=vs.100).aspx
[2].RichTextBox.Find 方法 (String, Int32, Int32, RichTextBoxFinds)：http://msdn.microsoft.com/zh-cn/library/yab8wkhy(v=vs.100).aspx

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.352 ms

返回

标题: RichTextBox.Find遍历搜索字符串中的坑

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.352 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.398 ms

返回