【问题标题】:Coloring a specific line of text in richTextBox C# [duplicate]在richTextBox C#中为特定的文本行着色[重复]
【发布时间】:2020-08-28 07:45:05
【问题描述】:

我是新来的,也是 C# 的新手。我基本上只想在我的报告中为最高温度(单行)上色,但我已经尝试了这里的所有编码,但没有任何效果。有人可以帮帮我吗?这是我的编码,比较两个城市的预测。如果有其他更简单的方法可以使用 listBox 等其他功能,请告诉我。

如果你看到图片,我现在基本上只是用星号来表示更高的温度。

输出:

New output

我的代码:

private void getComparison()
{

    this.richTextBox1.Text = ("Start Date:  " + dateTimePicker3.Value.ToString());
    this.richTextBox1.Text = ("COMPARE MULTIPLE CITIES FOR THE WEEK" + Environment.NewLine + "\n\n");

    for (int j = 0; j < 7; j++)
    {
        tempCity1 = Convert.ToInt32(a.getMaxi()[comboBox2.SelectedIndex, j].ToString());
        tempCity2 = Convert.ToInt32(a.getMaxi()[comboBox1.SelectedIndex, j].ToString());

        //City 1
        this.richTextBox1.Text = ("------------------------------------------");
        this.richTextBox1.Text = ("Day:  " + a.getDate(j).ToString());
        this.richTextBox1.Text = ("------------------------------------------");
        this.richTextBox1.Text = ("City:  " + arrCities[comboBox2.SelectedIndex]);
        this.richTextBox1.Text = ("Minimum Temperature:  " + a.getMini()[comboBox2.SelectedIndex, j].ToString() + "°C");
        
        
        
        if (tempCity1 < tempCity2)
        {
            this.richTextBox1.Text =("Maximum Temperature: " + a.getMaxi()[comboBox2.SelectedIndex, j].ToString() + "°C");
            //richTextBox1.SelectionColor = Color.Red;
        }
        else
        {
            this.richTextBox1.Text = ("***Maximum Temperature: " + a.getMaxi()[comboBox2.SelectedIndex, j].ToString() + "°C");
            //richTextBox1.SelectionBackColor = Color.Blue;
        }

        this.richTextBox1.Text = ("Precipitation:  " + a.getPrecip()[comboBox2.SelectedIndex, j].ToString() + "%");
        this.richTextBox1.Text = ("Humidity:  " + a.getHumid()[comboBox2.SelectedIndex, j].ToString() + "%");
        this.richTextBox1.Text = ("Wind speed:  " + a.getWindspeed()[comboBox2.SelectedIndex, j].ToString() + "km / h");
        this.richTextBox1.Text = ("" + Environment.NewLine + "\n\n");

        //City 2
        this.richTextBox1.Text = ("City:  " + arrCities[comboBox1.SelectedIndex]);
        this.richTextBox1.Text = ("Minimum Temperature:  " + a.getMini()[comboBox1.SelectedIndex, j].ToString() + "°C");

        if (tempCity1 > tempCity2)
        {
            this.richTextBox1.Text=("Maximum Temperature: " +  a.getMaxi()[comboBox1.SelectedIndex, j].ToString() + "°C");
            //richTextBox1.SelectionColor = Color.Red;
        }
        else
        {
            this.richTextBox1.Text = ("**Maximum Temperature:" + a.getMaxi()[comboBox1.SelectedIndex, j].ToString() + "°C");
            //richTextBox1.SelectionColor = Color.Blue;
        }


        //("Maximum Temperature:  " + a.getMaxi()[comboBox1.SelectedIndex, j].ToString() + "°C");
        this.richTextBox1.Text = ("Precipitation:  " + a.getPrecip()[comboBox1.SelectedIndex, j].ToString() + "%");
        this.richTextBox1.Text = ("Humidity:  " + a.getHumid()[comboBox1.SelectedIndex, j].ToString() + "%");
        this.richTextBox1.Text = ("Wind speed:  " + a.getWindspeed()[comboBox1.SelectedIndex, j].ToString() + "km / h");

    }

谢谢你:)

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/1926264/…
  • 没有办法该代码使用标准 RichTextBox 生成该输出。你到处都有this.richTextBox1.Text = 。这些调用中的每一个都将现有文本完全替换为仅该调用的行。您发布的代码的实际输出只有最后的“风速”行,没有别的。此外,每次像这样设置 .Text 属性时,都会完全删除任何现有格式(如颜色!)。除非您有一个从 RichTextBox 继承的自定义控件并且具有继承和覆盖的 .Text 属性?
  • 你很聪明 :) 是的,就像我说的那样,如果我可以用 listBox 做到这一点,请告诉我,照片中的输出是 listBox 但有人告诉我不要使用 listBox而是使用richTextBox。我的编码与listBox相同,只是名称richTextbox被替换了。我已经尝试了这些链接,但没有成功:(

标签: c# listbox richtextbox


【解决方案1】:

要为列表框中的项目着色,您需要重写“ListBox.DrawItem”事件。

只需将其复制到您的课程中即可:

private readonly List<Color> colors = new List<Color>();
private readonly List<string> texts = new List<string>();
private void ListBox_Draw(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1) return;
    e.DrawBackground();
    Graphics g = e.Graphics;
    //if the item is the maximum temperature item, draw with your color
    g.FillRectangle(new SolidBrush(colors[e.Index]), e.Bounds);
    g.DrawString(texts[e.Index], e.Font, new SolidBrush(e.ForeColor), e.Bounds);
    e.DrawFocusRectangle();
}

private void AddItem(string text, Color color)
{
    colors.Add(color);
    texts.Add(text);
    listBox1.Items.Add("");
}

并将其复制到 Form_Load 函数中:

listBox1.DrawMode = DrawMode.OwnerDrawVariable;//draw items manually
listBox1.DrawItem += ListBox_Draw;//subscribe to draw event

使用方法:

您只需使用 AddItem(your_text, the_color_of_this_item),而不是使用 listBox1.Items.Add()

例子:

AddItem("Item 1", Color.Red);
AddItem("This is item 2", Color.White);
AddItem("Hello from item 3", Color.Blue);
AddItem("I am item 4", Color.Purple);
AddItem("is it item 5?", Color.Yellow);
AddItem("Im the last item :(", Color.Green);

这就是示例的样子:

希望这会有所帮助!

【讨论】:

  • 那么如果我在我的循环中使用该方法,我将如何编写它?根据上面的代码? listBox 也会更容易使用吗?
  • 您的意思是列表框不是逐行写入richTextBox,而是要为每一行添加项目到列表框?如果是这样,您是否还想为列表框中的项目着色?
  • 是的,我已经将项目添加到列表框中,就像在那个输出中一样,但我只需要着色部分。我想为循环部分的输出着色以获得最高温度。
  • @YumnaDesai 我刚刚更新了我的答案。
  • 非常感谢,它适用于我的普通文本(正如我选择在照片中显示的那样),但是当我调用数组一以显示我的值时,它不起作用那里。我应该如何在那里实施它? AddItem("-----------------------------------------", Color.Red ); AddItem("城市:", Color.Blue + arrCities[comboBox2.SelectedIndex]); PS,我用新照片编辑了我的原始帖子,因为我无法在此处附加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2018-08-26
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多