C#如何更改组合框项目的颜色?

C#如何更改组合框项目的颜色?,c#,winforms,colors,combobox,C#,Winforms,Colors,Combobox,winform上的组合框, 组合框填充数据表三列(id、名称、状态) 我想更改状态列的组合框项目的颜色 请给出建议。我能做到这一点,但有一个bug。 首先是几个步骤 在表单中添加组合框(comboBox1) 将comboBox1的DrawItem事件更改为Combox1\u DrawItem(我们的方法如下) 编辑:将comboBox1的绘图模式属性更改为OwnerDrawFixed或OwnerDrawVariable 实现comboBox1\u DrawItem。注意,我在ComboBoxVa

winform上的组合框, 组合框填充数据表三列(id、名称、状态)

我想更改状态列的组合框项目的颜色


请给出建议。

我能做到这一点,但有一个bug。 首先是几个步骤

  • 在表单中添加组合框(comboBox1)
  • 将comboBox1的
    DrawItem
    事件更改为
    Combox1\u DrawItem
    (我们的方法如下)
  • 编辑:将comboBox1的
    绘图模式
    属性更改为
    OwnerDrawFixed
    OwnerDrawVariable
  • 实现
    comboBox1\u DrawItem
    。注意,我在
    ComboBoxValue.Status上切换画笔

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {  
        Brush brush;
        var g = e.Graphics;
        var rect = e.Bounds;
        var n = "";
        var f = new Font("Arial", 9, FontStyle.Regular);
    
        switch (((ComboBoxValue)((ComboBox)sender).SelectedItem).Status)
        {
            case "one":
                brush = Brushes.Red;
                break;
            case "two":
                brush = Brushes.Green;
                break;
            default:
                brush = Brushes.White;
                break;
        }
        if (e.Index >= 0)
        {
            n = ((ComboBoxValue)((ComboBox)sender).SelectedItem).Name;
        }
        g.FillRectangle(brush, rect.X, rect.Y,rect.Width, rect.Height);
        g.DrawString(n, f, Brushes.Black, rect.X, rect.Y);
    }
    
  • 我使用自己类的IList作为数据源。你的会不一样

    public class ComboBoxValues : System.Collections.ObjectModel.Collection<ComboBoxValue>
    {
        public ComboBoxValues()
        {
            this.Add(new ComboBoxValue
            {
                Name = "chad",
                Id = 123,
                Status = "one"
            });
            this.Add(new ComboBoxValue
            {
                Name = "different chad",
                Id = 123,
                Status = "two"
            });
        }
    }
    public class ComboBoxValue
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public string Status { get; set; }
    }
    

  • 您很快就会看到,由于某种原因,这些颜色似乎只有在您将鼠标移到它们上后才会改变。在我回到这个话题之前,也许其他人会意识到这个错误。祝你好运

    有人在winforms(状态栏)中听说过这件事吗?我只知道WPF中的这个术语!?datatablesee中的Status列名称在这里,如果您想对颜色做出非常模糊的决定,您必须在静态位置提供状态,或者从回调中的某个位置检索状态,但也许我的答案是正确的?您是否找到了鼠标悬停的错误?@Prix,因为这几乎是3年前的事,我想不起来为什么我没有发布对bug的修复。然而回顾过去,我确信这只是一个刷新问题。尝试在切换后调用控件上的刷新。感谢您的输入,我使用定制的组合框解决了它,还提出了一个有关它的问题,因为它将我困在了其他地方,但也找到了答案并发布了;)。由于某些原因,覆盖OnDraw不会产生与此处相同的问题。
    public class ComboBoxValues : System.Collections.ObjectModel.Collection<ComboBoxValue>
    {
        public ComboBoxValues()
        {
            this.Add(new ComboBoxValue
            {
                Name = "chad",
                Id = 123,
                Status = "one"
            });
            this.Add(new ComboBoxValue
            {
                Name = "different chad",
                Id = 123,
                Status = "two"
            });
        }
    }
    public class ComboBoxValue
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public string Status { get; set; }
    }
    
    comboBox1.DataSource = new ComboBoxValues();
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "Id";