【问题标题】:How to color lines in a listbox?如何为列表框中的线条着色?
【发布时间】:2010-09-22 18:04:38
【问题描述】:

喂! 我想在列表框中显示我的日志系统输出,并根据级别或日志条目自定义突出显示。 (一般、警告、错误、调试、跟踪)

somelistbox.Items.Add("Starting"); // I would like to drawn this as grey
somelistbox.Items.Add("Error!"); // I would like to drawn this as red

所以我想添加一个新的东西,比如 typeoflog,但我不知道怎么做。

somelistbox.Items.Add("Error!",Type.Error); 

我有这个代码,它为 items 着色,取决于项目编号,但这不是我要找的。​​p>

    private void general_log_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush myBrush = Brushes.Black;
        switch (actualLogType)
        {
            case LogTypes.General:
                myBrush = Brushes.Black;
                break;
            case LogTypes.Warning:
                myBrush = Brushes.Orange;
                break;
            case LogTypes.Error:
                myBrush = Brushes.Purple;
                break;
            case LogTypes.Debug:
                myBrush = Brushes.AntiqueWhite;
                break;
        }
        e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }

更新:如果有人还在研究这个,我建议看看 NLog 项目。它有彩色的富文本框目标。

【问题讨论】:

    标签: .net winforms listbox


    【解决方案1】:

    ListBox 不仅可以存储字符串,还可以存储对象。您想在这里利用这一点,您案例中的列表项具有比文本更多的状态。添加一个小嵌套帮助类:

        private enum itemType { error, warning }
    
        private class listObject {
            public listObject(string txt, itemType type) { Text = txt; Type = type; }
            public string Text;
            public itemType Type;
            public override string ToString() { return Text; }
        }
    

    注意 ToString() 覆盖如何生成用户看到的文本。现在只需像这样将项目添加到列表框中:

            listBox1.Items.Add(new listObject("blah", itemType.warning));
    

    然后在 DrawItem 事件处理程序中将对象转换回您的类:

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
            var obj = listBox1.Items[e.Index] as listObject;
            // etc..
        }
    

    并使用 obj.Type 来确定颜色。

    【讨论】:

    • 你的代码太酷了,但我还不能让它工作。你能给我写下整个 DrawnItem 方法吗?非常非常感谢你!这是我尝试的方法pastie.org/1175240
    • 如果你想要不同的颜色,你实际上必须使用不同的画笔。使用 switch(obj.Type) {} 创建它。就像您在原始代码 sn-p 中所做的那样。
    • 需要检查e.Index,如果值>=0才做自定义绘制代码。添加if()语句。
    • 嗯,我现在调试了它,问题是,当我单击我的按钮时,不会调用 DrawnItem 事件:/ private void bot_stop_Click(object sender, EventArgs e) { general_log_add_item("ASDASD" , Logging.LogTypes.General); }
    • 嗯,该项目可能不可见。滚动列表框。请提出一个新问题,这与原来的问题相差甚远。
    【解决方案2】:

    如果不是 WPF 列表框,则需要使用 Win32 API。这就是你所追求的吗?

    更新

    无需使用 WIn32 API: http://www.codeproject.com/KB/combobox/ColorListBoxIcons.aspx

    【讨论】:

    【解决方案3】:

    你也可以使用 ListView 来代替 ListBox,这样你就可以访问它的 BackColor 属性:

    listView1.Items[i].BackColor = Color.Black;
    

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2022-01-10
      • 1970-01-01
      • 2020-04-16
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多