【问题标题】:richtextbox.find and select duplicate textrichtextbox.find 并选择重复的文本
【发布时间】:2014-12-03 01:09:21
【问题描述】:

我目前有一个富文本框,用于显示长字符串。我使用以下代码在字符串中选择一个“重要”项目列表,使其显示为粗体。

foreach (string item in selectionList)
{
     if (item.Length != 0)
     {
          int charStart = richTextBox.Find(item);
          richTextBox.SelectionFont = selectedFont;
          richTextBox.Select(charStart, item.Length);
     }
 }

如果重复项目出现在文本中,我想知道选择重复项目的最有效方法。例如。 (本例中以大写突出显示的文本)“我想订购一些汉堡、薯条和薯条”

这只是示例数据,我使用的数据中有一些重复,所以我确实需要能够处理这种情况。 (这与以下查询相同:duplicate selection in text() XPath selector 但在 C# 中)

目前,该项目在 selectionList 中出现了两次,但我的代码仅在 richTextBox 中找到该单词的第一个实例,而最后一个实例未突出显示。我正在使用 C# 和 .net 4.0 在 VS2013 中工作。

非常感谢, 安雅

【问题讨论】:

  • 是的,看起来很棒!除了我确实需要选择短语而不是单个单词。而且,仔细观察,这个问题是询问如何查找重复项,我使用 List 来保存我的项目并且可以轻松找到重复项,我现在需要知道选择文本中所有实例的最有效方法,而不是不仅仅是第一个。
  • 实际上,如果能够在文本框中选择每个重复项而不需要选择列表中的重复项,那就太好了。例如。 SelectionList = (burgers, chips) 如果能够自动选择每个单词的每个实例,那就太好了。

标签: c# winforms .net-4.0


【解决方案1】:

您在循环中调用 Find(),直到返回 -1。请注意,循环中的调用从最后找到的位置 + 1 开始:

        foreach (string item in selectionList)
        {
            if (item.Length != 0)
            {
                int charStart = richTextBox.Find(item, RichTextBoxFinds.None);
                while (charStart != -1)
                { 
                    richTextBox.SelectionFont = selectedFont;
                    richTextBox.Select(charStart, item.Length);
                    charStart = richTextBox.Find(item, charStart + 1, RichTextBoxFinds.None);
                }
            }
        }

【讨论】:

  • 看起来是正确的事情,但是如果这个特定的代码只能找到一个实例,它会导致无限循环!
  • ?...不,它只适用于一个实例。我测试了它。当找不到更多实例时,对 Find() 的第二次调用将返回 -1。给我看看你的实现...
【解决方案2】:

我想出了这个,但我真的在这里寻找效率。有谁能做得更好?

if (item.Length != 0)
{
     if (!richTextBox.SelectedText.Contains(item))
     {
         int charStart = richTextBox.Find(item);
         richTextBox.SelectionFont = selectedFont;
         richTextBox.Select(charStart, item.Length);
     }
     else
     {
         int charStart = richTextBox.Find(item);
         charStart = richTextBox.Find(item, charStart + item.Length, RichTextBoxFinds.None);
          richTextBox.SelectionFont = selectedFont;
          richTextBox.Select(charStart, item.Length);
      }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2021-12-29
    • 2014-02-11
    相关资源
    最近更新 更多