Change the background color of Winform ListView headers

前端 未结 2 754
孤街浪徒
孤街浪徒 2021-01-17 11:18

How can you change the background color of the Headers of a ListView?

相关标签:
2条回答
  • 2021-01-17 11:39

    You can do this by setting the OwnerDraw property for the list view to true.

    This then allows you to provide event handlers for the listview's draw events.

    There is a detailed example on MSDN

    Below is some example code to set the header colour to red:

        private void listView1_DrawColumnHeader(object sender,
                                                DrawListViewColumnHeaderEventArgs e)
        {
            e.Graphics.FillRectangle(Brushes.Red, e.Bounds);
            e.DrawText();
        }
    

    I think (but am happy to be proved wrong) that with OwnerDraw set to true, you will need to also provide handlers for the other draw events that have default implementations as shown below:

        private void listView1_DrawItem(object sender,
                                        DrawListViewItemEventArgs e)
        {
            e.DrawDefault = true;
        }
    

    I certainly haven't managed to make the listview draw the items without that.

    0 讨论(0)
  • 2021-01-17 11:40

    I know this is a little late to the party but I still saw this post and this would have helped me. Here is a little abstracted application of the code david supplied

    using System.Windows.Forms;
    using System.Drawing;
    
    //List view header formatters
    public static void colorListViewHeader(ref ListView list, Color backColor, Color foreColor)
    {
        list.OwnerDraw = true;
        list.DrawColumnHeader += 
            new DrawListViewColumnHeaderEventHandler
            (
                (sender, e) => headerDraw(sender, e, backColor, foreColor)
            );
        list.DrawItem += new DrawListViewItemEventHandler(bodyDraw);
    }
    
    private static void headerDraw(object sender, DrawListViewColumnHeaderEventArgs e, Color backColor, Color foreColor)
    {
        using (SolidBrush backBrush = new SolidBrush(backColor))
        {
            e.Graphics.FillRectangle(backBrush, e.Bounds);
        }
    
        using (SolidBrush foreBrush = new SolidBrush(foreColor))
        {
            e.Graphics.DrawString(e.Header.Text, e.Font, foreBrush, e.Bounds);
        }
    }
    
    private static void bodyDraw(object sender, DrawListViewItemEventArgs e)
    {
        e.DrawDefault = true;
    }
    

    Then call this in your form constructor

    public Form()
    {
        InitializeComponent();
        *CLASS NAME*.colorListViewHeader(ref myListView, *SOME COLOR*, *SOME COLOR*);
    }
    

    Just replace the *CLASS NAME* with whatever class you put the first bit of code in and the *SOME COLOR*'s with some sort of color.

    //Some examples:
    Color.white
    SystemColors.ActiveCaption
    Color.FromArgb(0, 102, 255, 102);
    
    0 讨论(0)
提交回复
热议问题