0

我正在做一个文字处理器。字处理器具有允许用户在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 表单上。

4

3 回答 3

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);
}
于 2013-04-10T02:22:06.397 回答
1

您可以使用正则表达式

 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;
            }
        }

结果:

在此处输入图像描述

于 2013-04-10T02:55:06.587 回答
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 中的文本转换为小写。保持在温度
  • 将 RichTextBox 文本设置为空
  • 用 temp 替换 RichTextBox 文本

当然,它会使您的 RichTextBox 小写。

编辑2:

好的,似乎用户想通过给定的关键字突出显示所有找到的文本,但它不起作用。我会试着回答它。

首先,不要在富文本框中使用 Find() 方法,而是使用SelectionStartand 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;
于 2013-04-10T02:19:35.413 回答