我正在制作一个文字处理器。文字处理器有一个工具,允许用户在richTextBox中搜索文本。
目前,我的“查找”代码包含:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Basic_Word_Processor
{
public partial class Find : Form
{
public Find()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int index = 0;
string temp = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text;
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text = "";
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text = temp;
while (index < Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text.LastIndexOf(textBox1.Text))
{
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Find(textBox1.Text, index, Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.TextLength, RichTextBoxFinds.None);
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionBackColor = Color.Yellow;
index = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text.IndexOf(textBox1.Text, index) +1;
{
}
}
}
private void Find_FormClosing(object sender, FormClosingEventArgs e)
{
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionBackColor = Color.White;
}
}
}
但是,如果richTextBox包含单词“TEST”,并且用户搜索“test”,则不会找到任何结果。
我在MSDN论坛上问了同样的问题,但我被告知转换textBox和richTextBox ToLower,这有效,但它使richTextBox中的文本小写。我不希望它改变richTextBox中的实际文本。
有什么建议吗?
编辑
textBox位于Find表单上,richTextBox位于Basic_Word_Processor表单上。
答案 0 :(得分:1)
我认为默认情况下C#区分大小写,但LastIndexOf(可能是IndexOf)有一个重载,允许通过指定StringComparison.InvariantCultureIgnoreCase(或类似的东西)之类的参数进行不区分大小写的搜索。请参阅http://msdn.microsoft.com/en-us/library/ms224422.aspx。
编辑:
为了澄清,我建议将代码更改为:
string findText = textBox1.Text;
string currentText = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text;
int index = currentText.IndexOf(findText, StringComparison.InvariantCultureIgnoreCase);
while (index >= 0)
{
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Find(findText, index, currentText.Length, RichTextBoxFinds.None);
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionBackColor = Color.Yellow;
index = currentText.IndexOf(findText, index+1, StringComparison.InvariantCultureIgnoreCase);
}
然而,现在我考虑一下,你应该能够做一些更简单的事情,例如:
int index = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Find(findText, RichTextBoxFinds.None);
while (index >= 0)
{
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionBackColor = Color.Yellow;
index = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Find(findText, index+1, RichTextBoxFinds.None);
}
答案 1 :(得分:1)
您可以使用Regex
private void button1_Click(object sender, EventArgs e)
{
Regex reg = new Regex("text",RegexOptions.IgnoreCase);
foreach (Match find in reg.Matches(richTextBox1.Text))
{
richTextBox1.Select(find.Index, find.Length);
richTextBox1.SelectionColor = Color.Red;
}
}
<强>结果:强>
答案 2 :(得分:0)
调用text1.Text.ToLower()
不会使富文本框中的文本为小写,因为它只返回值。
您可以将其保存在字符串中:
string text = text1.Text.ToLower();
然后使用字符串文本处理搜索。
此外,我不太确定Find
方法,但它应该有一个忽略大小写选项。如果没有,请确保将比较文本转换为小写。
编辑:
我可能会错误地认为哪一个是richTextBox,text1
或Basic_Word_Processor.Instance.richTextBoxPrintCtrl1
如果案例是Basic_Word_processor中的案例,那么您在评论中提供的MSDN链接中:
string temp = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text.ToLower();
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text = "";
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text = temp;
它基本上说:
当然它会使你的RichTextBox小写。
EDIT2:
好像用户想要通过给定的关键字突出显示所有找到的文本,但它不起作用。我会尽力回答。
首先,
而不是在富文本框中使用Find()方法,而是使用SelectionStart
和SelectionLength
。我没有看到Find()方法给出不区分大小写的比较。
示例:
string richText = Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text.ToLower();
string keyText = textBox1.Text.ToLower();
在while语法中,使用重载字符串LastIndexOf来比较非大小写敏感。现在这可能不是问题,因为富人已经处于较低的状态。
while (index < richText.LastIndexOf(textBox1.Text, StringComparison.InvariantCultureIgnoreCase))
然后要查找文本,请使用以下命令:
index = richText.IndexOf(keyText, index);
然后设置颜色如下:
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionStart = index;
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionLength = keyText.Length;
Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.SelectionBackColor = Color.Yellow;