【问题标题】:Changing character colour from input从输入更改字符颜色
【发布时间】:2016-02-09 04:30:45
【问题描述】:

如果文本框中的输入与富文本框中的输入匹配,我正在尝试更改字符的颜色。

char key = e.KeyChar;
for(int i = 0; i < rchtxtbox.Text.Length; i++)
{
    char currentLetter = rchtxtbox.Text[i];
    if (key == currentLetter)
    {
        rchtxtbox.SelectionStart = 0;
        rchtxtbox.SelectionLength = 1;
        rchtxtbox.SelectionColor = Color.White;
        rchtxtbox.SelectionBackColor = Color.LightGreen;
    }
}

仅在匹配时突出显示当前字母。一个例子是,如果富文本框中的单词是“balloon”并且第一次输入的输入是“b”,它会匹配并改变颜色,但是如果添加了下一个字母“ba”,则函数停止工作并且不会改变颜色。我尝试过的其他替代方法最终改变了所有匹配字符的颜色。如果匹配,我希望能够逐个字符地为它着色,有没有办法轻松做到这一点?

【问题讨论】:

  • 您需要正确设置 `rchtxtbox.SelectionStart' 到适当的字符索引。在您的代码中,选择起点为零,因此它将始终突出显示第一个字符
  • 我尝试将值更改为 i 值,但这会突出显示所有匹配项。例如,如果我有“plop”,如果我输入“p”,它将突出显示开始和结束 p's
  • 好的,然后从文本框中获取最后一个键控字符,获取它的索引并匹配来自richtextbox的相同索引字符,如果匹配则突出显示那个而不是运行循环
  • 哪个事件处理程序有这个代码?
  • 文本框的按键事件

标签: c# textbox richtextbox


【解决方案1】:

好的,以下是实现此目的的方法。我使用了 KeyUp 事件而不是 keypress

private void textBox1_KeyUp(object sender, KeyEventArgs e) {           
    if (textBox1.TextLength == 0) { return; }

    int index;
    index = textBox1.TextLength - 1;
    char key = textBox1.Text[index];

    if (rchtxtbox.TextLength > index  && rchtxtbox.Text[index] == key) {   
        if (rchtxtbox.Text[index] == key) {
                rchtxtbox.SelectionStart = index;
                rchtxtbox.SelectionLength = 1;
                rchtxtbox.SelectionColor = Color.White;
                rchtxtbox.SelectionBackColor = Color.LightGreen;
        }
    }
}

确保将上面的 textBox1 替换为文本框的名称

【讨论】:

  • 我注意到它有时会错过突出显示某些字符。这可能是由于 KeyUp 事件。但是,如果我将代码移到按键事件中,它不喜欢索引?
  • 太棒了。您是否对我建议的代码修复进行了任何更改或按原样工作?
  • 因为它在 keyup 事件中,它在不突出匹配字符的地方略微卡顿。这可能是由于 keyup 造成的,所以我只是简单地将其移至 keypress 事件,但它不喜欢索引,因此我将其保留为 .TextLength 而不对索引进行任何减法,并将键改为 KeyChar .再次感谢您的帮助!
  • 不客气。很高兴知道您的问题已解决
【解决方案2】:

如果我正确理解您的问题,问题只是您只选择了第一个字符进行突出显示。

您应该将 SelectionStart 设置为 i,以便选择并突出显示您要与之比较的角色:

rchtxtbox.SelectionStart = i;

编辑:

在考虑了你想要做什么之后,我认为你有一个包含文本的富文本框。您还有一个用户正在输入的文本框。当用户在文本框中键入内容时,您希望在富文本框中突出显示该文本。对吗?

这里是一个简单的例子,虽然这并不能说明多次出现的文本。

        private void textBox1_TextChanged(object sender, EventArgs e)
    {
        int idx = richTextBox1.Text.IndexOf(textBox1.Text);

        if (idx > -1)
        {
            richTextBox1.SelectionStart = idx;
            richTextBox1.SelectionLength = textBox1.Text.Length;
            richTextBox1.SelectionColor = Color.White;
            richTextBox1.SelectionBackColor = Color.LightGreen;
        }

    }

【讨论】:

  • 我试过这个,它接受输入并在富文本框中突出显示所有正确的匹配项,而理想情况下我只希望突出显示 currentPosition - 如果正确的话。
猜你喜欢
  • 2018-04-12
  • 2018-02-03
  • 2021-11-20
  • 2013-03-08
  • 1970-01-01
  • 2020-07-30
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多