为什么在richTextBox中突出显示单词时,它会突出显示richTextBox中的所有文本?

Jiale Xue - MSFT 46,556 信誉分 Microsoft 供应商
2024-05-30T06:48:27.2566667+00:00

我有一个 listView 控件名称 lvnf 中的项列表。

当我在 listView 中选择一个项目时,它正在读取硬盘上的项目文件,并在 richTextBox1 中显示其内容。

将文件内容添加到 richTextBox1 后,我想突出显示 richTextBox1 中的特定单词,但将此单词着色为黄色。

问题在于它正在对 richTextBox1 中的所有内容进行着色。

foreach 循环中的 myword 是每个单词(字符串) 我想在 richTextBox1 中用黄色着色,但它将 richTextBox1 中的所有内容都涂成黄色。

void lvnf_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listViewCostumControl1.lvnf.SelectedItems.Count > 0)
            {
                results = new List<int>();
                richTextBox1.Text = File.ReadAllText(listViewCostumControl1.lvnf.Items[listViewCostumControl1.lvnf.SelectedIndices[0]].Text);
                FileInfo fi = new FileInfo(listViewCostumControl1.lvnf.Items[listViewCostumControl1.lvnf.SelectedIndices[0]].Text);
                lblfilesizeselected.Text = ExtensionMethods.ToFileSize(fi.Length);
                lblfilesizeselected.Visible = true;
                filePath = Path.GetDirectoryName(fi.FullName);
                string word = textBoxSearchBox.Text;
                string[] test = word.Split(new string[] { ",," }, StringSplitOptions.None);
                foreach (string myword in test)
                {
                    HighlightPhrase(richTextBox1, myword, Color.Yellow);
                    lblviewerselectedfile.Text = results.Count.ToString();
                    lblviewerselectedfile.Visible = true;
                    if (results.Count > 0)
                    {
                        numericUpDown1.Maximum = results.Count;
                        numericUpDown1.Enabled = true;
                        richTextBox1.SelectionStart = results[(int)numericUpDown1.Value];
                    }
                }
            }
        }

此方法是 HighlightPhrase,它应该在 richTextBox1 中找到单词

void HighlightPhrase(RichTextBox box, string phrase, Color color)
        {
            int pos = box.SelectionStart;
            string s = box.Text;
            for (int ix = 0; ;)
            {
                int jx = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase);
                if (jx < 0)
                {
                    break;
                }
                else
                {
                    box.SelectionStart = jx;
                    box.SelectionLength = phrase.Length;
                    box.SelectionColor = color;
                    ix = jx + 1;
                    results.Add(jx);
                }
            }
            box.SelectionStart = pos;
            box.SelectionLength = 0;
        }

Note:此问题总结整理于: Why when highlighting word/s in richTextBox it's highlighting all the text in the richTextBox ?

Windows 窗体
Windows 窗体
一组用于开发图形用户界面的 .NET Framework 托管库。
114 个问题
C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
189 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 48,571 信誉分 Microsoft 供应商
    2024-05-30T09:17:40.4033333+00:00

    根据我的测试,我发现我可以运行您的代码来为 Richtextbox 中的特定单词着色。

    另外,请注意,您在这里缺少一些代码,我对其进行了一些更改。

    更改此内容

      for (int ix = 0; ;)  
    

    到:

      for (int ix = 0;ix<s.Length ;ix++)  
    

    这是一个适合我的代码示例。(仅更改了上述代码)

    List<int> results = new List<int>();  
            private void listView1_SelectedIndexChanged(object sender, EventArgs e)  
            {  
               
                if (listView1.SelectedItems.Count > 0)  
                {  
                    richTextBox1.Text = File.ReadAllText(listView1.Items[listView1.SelectedIndices[0]].Text);  
                    FileInfo fi = new FileInfo(listView1.Items[listView1.SelectedIndices[0]].Text);  
                    //lblfilesizeselected.Text = ExtensionMethods.ToFileSize(fi.Length);  
                    //lblfilesizeselected.Visible = true;  
                    string filePath = Path.GetDirectoryName(fi.FullName);  
                    string word = textBox1.Text;  
                    string[] test = word.Split(new string[] { ",," }, StringSplitOptions.None);  
                    foreach (string myword in test)  
                    {  
                        HighlightPhrase(richTextBox1, myword, Color.Yellow);  
                        //lblviewerselectedfile.Text = results.Count.ToString();  
                        //lblviewerselectedfile.Visible = true;  
                        if (results.Count > 0)  
                        {  
                            numericUpDown1.Maximum = results.Count;  
                            numericUpDown1.Enabled = true;  
                            richTextBox1.SelectionStart = results[(int)numericUpDown1.Value];  
                        }  
                    }  
                }  
            }  
      
            void HighlightPhrase(RichTextBox box, string phrase, Color color)  
            {  
                int pos = box.SelectionStart;  
                string s = box.Text;  
                for (int ix = 0;ix<s.Length ;ix++)  
                {  
                    int jx = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase);  
                    if (jx < 0)  
                    {  
                        break;  
                    }  
                    else  
                    {  
                        box.SelectionStart = jx;  
                        box.SelectionLength = phrase.Length;  
                        box.SelectionColor = color;  
                        ix = jx + 1;  
                        results.Add(jx);  
                    }  
                }  
                box.SelectionStart = pos;  
                box.SelectionLength = 0;  
            }  
      
            private void Form1_Load(object sender, EventArgs e)  
            {  
                listView1.SelectedIndexChanged += listView1_SelectedIndexChanged;  
                listView1.View = View.Details;  
                listView1.Columns.Add("Path");  
                listView1.Columns.Add("Name");  
                ListViewItem lvi = new ListViewItem();  
                lvi.Text = "D:\\1.txt";  
                lvi.SubItems.Add("test1");  
                ListViewItem lvi1 = new ListViewItem();  
                lvi1.Text = "D:\\2.txt";  
                lvi1.SubItems.Add("test2");  
                ListViewItem lvi2 = new ListViewItem();  
                lvi2.Text = "D:\\3.txt";  
                lvi2.SubItems.Add("test3");  
                listView1.Items.Add(lvi);  
                listView1.Items.Add(lvi1);  
                listView1.Items.Add(lvi2);  
            }  
    

    结果: 126647-111.gif


    如果回复有帮助,请点击“接受答案”并点赞。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。