Question

I have a little problem with a Listview.

I can load it with listview items fine, but when I set the background color it doesn't draw the color all the way to the left side of the row [The listViewItems are loaded with ListViewSubItems to make a grid view, only the first column shows the error]. There is a a narrow strip that doesn't paint. The width of that strip is approximately the same as a row header would be if I had a row header.

If you have a thought on what can be done to make the background draw I'd love to hear it.

Now just to try a new idea, I'm offering a ten vote bounty for the first solution that still has me using this awful construct of a mess of a pseudo grid view. [I love legacy code.]

Edit:

Here is a sample that exhibits the problem.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ListView lv = new ListView();

        lv.Dock = System.Windows.Forms.DockStyle.Fill;
        lv.FullRowSelect = true;
        lv.GridLines = true;
        lv.HideSelection = false;
        lv.Location = new System.Drawing.Point(0, 0);
        lv.TabIndex = 0;
        lv.View = System.Windows.Forms.View.Details;
        lv.AllowColumnReorder = true;

        this.Controls.Add(lv);

        lv.MultiSelect = true;

        ColumnHeader ch = new ColumnHeader();
        ch.Name = "Foo";
        ch.Text = "Foo";
        ch.Width = 40;
        ch.TextAlign = HorizontalAlignment.Left;

        lv.Columns.Add(ch);

        ColumnHeader ch2 = new ColumnHeader();
        ch.Name = "Bar";
        ch.Text = "Bar";
        ch.Width = 40;
        ch.TextAlign = HorizontalAlignment.Left;

        lv.Columns.Add(ch2);

        lv.BeginUpdate();

        for (int i = 0; i < 3; i++)
        {


            ListViewItem lvi = new ListViewItem("1", "2");

            lvi.BackColor = Color.Black;
            lvi.ForeColor = Color.White;

            lv.Items.Add(lvi);
        }
        lv.EndUpdate();
    }
}
Was it helpful?

Solution

Ah! I see now :}

You want hacky? I present unto you the following:

    ...
    lv.OwnerDraw = true;
    lv.DrawItem += new DrawListViewItemEventHandler( lv_DrawItem );
    ...

void lv_DrawItem( object sender, DrawListViewItemEventArgs e )
{
    Rectangle foo = e.Bounds;
    foo.Offset( -10, 0 );
    e.Graphics.FillRectangle( new SolidBrush( e.Item.BackColor ), foo );
    e.DrawDefault = true;
}

For a more inventive - and no less hacky - approach, you could try utilising the background image of the ListView ;)

OTHER TIPS

(Prior to the Edit...)

I've just tried setting the BackColor on a System.Windows.Forms.ListView, and the color is applied across the control just fine (with and without images).

Are you doing any Custom Painting at all?

Ok I'm adding some additional solution notes. If you use the solution above you also need to insert a draw handler for the column headers, otherwise they won't paint. The selected item rectangle also looks funny so you'll want to check for that in the lv_DrawItem function and implement a similar solution. Remeber that highlighting is chosen at the system level and not in you application.

Better ListView (and free Better ListView Express) allows setting background image with various alignment settings (centered, tiled, stretched, fit, snap to border/corner). Alpha transparency is also supported:

enter image description here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top