winforms 循环访问RichTextBox,使特定单词变为粗体

pu82cl6c  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(170)

我写了一个真空管交叉引用程序。我不知道如何迭代RichTextBox1来使请求的管值加粗。
搜索6AU8A时的现有输出

Tube        Cross1      Cross2      Cross3          Qty     Location
6AU8        6AU8A       6BH8        6AW8            2       PM BOX 3
6AU8A       6AU8        6BH8        6AW8            6       BOX 9
6BA8A       6AU8        6AU8A       8AU8A           1       BOX 11
6CX8        6AU8A       6EB8        6GN8            2       BOX 16
6EH5        6AU8A       2081        6AW8A#          1       BOX 19
6GH8        6EA8        6GH8A       6AU8A           2       BOX 23
6GH8A       6GH8        6EA8        6AU8A           10      BOX 22
6GH8A       6GH8        6EA8        6AU8A           5       BOX 23

因此,我需要搜索词的任何出现(在本例中为6AU8A)在粗体。使用VS 2019,Windows应用程序,编译为.NET 4.8.1,在Windows 7 & 10 PC上运行。

public int FindMyText(string text)
        {
            length = text.Length;
            // Initialize the return value to false by default.
            int returnValue = -1;

            // Ensure that a search string has been specified and a valid start point.
            if (text.Length > 0)
            {
                // Obtain the location of the first character found in the control
                // that matches any of the characters in the char array.
                int indexToText = richTextBox1.Find(text);
                // Determine whether the text was found in richTextBox1.
                if (indexToText >= 0)
                {
                    // Return the location of the character.
                    returnValue = indexToText;
                    start = indexToText;
                }
            }

            return returnValue;
        }
thigvfpy

thigvfpy1#

调用Find()后,该值将被选择(如果存在的话)。然后您可以将字体更改为包含粗体。Find()函数有一个“Start”位置,它允许您查找下一个匹配项。因此您从0开始,然后加上搜索字符串的长度以获得下一个起始位置。如果返回的值为-1,那么就没有匹配了,你可以停止了。
看起来像这样:

private void button1_Click(object sender, EventArgs e)
{
    BoldText("6AU8A"); // get your input from somewhere...
}

private void BoldText(String value)
{
    int startAt = 0;
    int indexToText = richTextBox1.Find(value, startAt, RichTextBoxFinds.None);
    while (indexToText != -1)
    {
        richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, FontStyle.Bold);
        startAt = startAt + value.Length;
        indexToText = richTextBox1.Find(value, startAt, RichTextBoxFinds.None);
    }
}

以下是它的实际应用:

pkln4tw6

pkln4tw62#

如果您确实需要为此使用RichTextBox,则可以使用一个简单的Regex来匹配一个或多个 terms,然后使用每个Match的IndexLength属性来执行选择并更改Font和/或其他样式(在此处的代码中,可以选择颜色)
将要比对的词汇集合(包含一或多个词汇)传递至方法:

string[] parts = { "6AU8A", "6GH8" };
Highlight(richTextBox1, parts, FontStyle.Bold);
// also specifying a Color
Highlight(richTextBox1, parts, FontStyle.Bold, Color.Red);
// or deselect previous matches
Highlight(richTextBox1, parts, FontStyle.Regular);

Regex只匹配完整的序列,例如,传递6GH8,它不会部分突出显示6GH8A
如果您喜欢部分选择,请删除图案中的两个\b边界

using System.Text.RegularExpressions;

private void Highlight(RichTextBox rtb, IEnumerable<string> terms, FontStyle style, Color color = default)
{
    color = color == default ? rtb.ForeColor : color;

    string pattern = $@"\b(?:{string.Join("|", terms)})\b";
    var matches = Regex.Matches(rtb.Text, pattern, RegexOptions.IgnoreCase);

    using (var font = new Font(rtb.Font, style)) { 
        foreach (Match m in matches) {
            rtb.Select(m.Index, m.Length);
            rtb.SelectionColor = color;
            rtb.SelectionFont = font;
        };
    }
}

相关问题