Serge Wautier
Serge Wautier

Reputation: 21878

How to reclaim image real estate in ListView?

Env.: VS 2008, .NET 2.0, WinForms

I have a listview in Tile mode. Some items have an associated image. Some don't.

The contents (listview items) is often renewed when user clicks some controls. When this happens, it sometimes appears that none of the new items have images. In that case, I would like to get rid of the empty space on the left of items reserved for images. I tried the following pseudo-code to temporarily get rid of the image list

list.Items.Clear();
FillList();
list.LargeImageList= (none of the items has image) ? null : MyImageList;

But it doesn't work: The empty space is still there. I also try to repaint the control, to no avail.

alt text http://apptranslator.com/_so/so_list1.jpg alt text http://apptranslator.com/_so/so_list2.jpg alt text http://apptranslator.com/_so/so_list3.jpg

Left: list with images.

Middle: List without images. Space for images is visible.

Right: How I would like it to be when there's no images.

EDIT: I also made this test: Don't assign the image list in the designer. If the first display doesn't contain any images, then I get the expected result. I then click to display images (I get them). I click again to come back to a no images selection: the image space doesn't disappear.

Also, Hath, no I don't use small images or state images. Only large images.

What can I do? TIA.

Upvotes: 0

Views: 1375

Answers (3)

jocull
jocull

Reputation: 21095

I too was having this exact issue recently. Something I noticed is that regardless of what the LargeImageList ImageSize is set to (or even if LargeImageList is NULL!), the ListView will always act as if the LargeImageList.ImageSize is still set to it's last value.

In my program, I wasn't using the SmallImageList at all, so it was NULL all along. In my constructor for the form, I just set this to a new ImageList() for the ListView and locked the size in at (1,1). Problem went away! Seemed like a dumb bug to have.

    public frmMain()
    {
        InitializeComponent();
        this.Text = Program.AppName;

        lstSightings.SmallImageList = new ImageList();
        lstSightings.SmallImageList.ImageSize = new Size(1, 1);

        RefreshItems();
    }

Upvotes: 0

xpda
xpda

Reputation: 15813

If you want complete control, use the listview.drawitem event.

Upvotes: 0

Hath
Hath

Reputation: 12769

Are you sure? I've got it working in this test case:

using System;
using System.Windows.Forms;
public class MainForm : Form
{
    private System.ComponentModel.IContainer components = null;
    private System.Windows.Forms.ListView listView;
    private System.Windows.Forms.ImageList emptySmallImageList;
    private System.Windows.Forms.ImageList largeImageList;
    private System.Windows.Forms.Button imageListSmallButton;
    private System.Windows.Forms.Button imageListLargeButton;

    public MainForm()
    {
        InitializeComponent();
    }

    private void OnImageListSmallButtonClick(object sender, EventArgs e)
    {
        this.listView.LargeImageList = emptySmallImageList;       
    }

    private void OnImageListLargeButtonClick(object sender, EventArgs e)
    {
        this.listView.LargeImageList = largeImageList;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("fgsdfg");
        System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("sdfgsdfg");
        System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem("sdfgsdfgsdfg");
        System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem("sdfgsdfg");
        this.listView = new System.Windows.Forms.ListView();
        this.largeImageList = new System.Windows.Forms.ImageList(this.components);
        this.emptySmallImageList = new System.Windows.Forms.ImageList(this.components);
        this.imageListSmallButton = new System.Windows.Forms.Button();
        this.imageListLargeButton = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // listView
        // 
        this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
        this.listView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
        listViewItem5,
        listViewItem6,
        listViewItem7,
        listViewItem8});
        this.listView.LargeImageList = this.largeImageList;
        this.listView.Location = new System.Drawing.Point(0, 0);
        this.listView.Name = "listView";
        this.listView.Size = new System.Drawing.Size(292, 266);
        this.listView.TabIndex = 0;
        this.listView.UseCompatibleStateImageBehavior = false;
        this.listView.View = System.Windows.Forms.View.Tile;
        // 
        // largeImageList
        // 
        this.largeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
        this.largeImageList.ImageSize = new System.Drawing.Size(32, 32);
        this.largeImageList.TransparentColor = System.Drawing.Color.Transparent;
        // 
        // emptySmallImageList
        // 
        this.emptySmallImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
        this.emptySmallImageList.ImageSize = new System.Drawing.Size(1, 1);
        this.emptySmallImageList.TransparentColor = System.Drawing.Color.Transparent;
        // 
        // imageListSmallButton
        // 
        this.imageListSmallButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
        this.imageListSmallButton.Location = new System.Drawing.Point(175, 12);
        this.imageListSmallButton.Name = "imageListSmallButton";
        this.imageListSmallButton.Size = new System.Drawing.Size(95, 23);
        this.imageListSmallButton.TabIndex = 1;
        this.imageListSmallButton.Text = "ImageList 1x1";
        this.imageListSmallButton.UseVisualStyleBackColor = true;
        this.imageListSmallButton.Click += new System.EventHandler(this.OnImageListSmallButtonClick);
        // 
        // imageListLargeButton
        // 
        this.imageListLargeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
        this.imageListLargeButton.Location = new System.Drawing.Point(175, 53);
        this.imageListLargeButton.Name = "imageListLargeButton";
        this.imageListLargeButton.Size = new System.Drawing.Size(95, 23);
        this.imageListLargeButton.TabIndex = 2;
        this.imageListLargeButton.Text = "ImageList 32x32";
        this.imageListLargeButton.UseVisualStyleBackColor = true;
        this.imageListLargeButton.Click += new System.EventHandler(this.OnImageListLargeButtonClick);
        // 
        // MainForm
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(292, 266);
        this.Controls.Add(this.imageListLargeButton);
        this.Controls.Add(this.imageListSmallButton);
        this.Controls.Add(this.listView);
        this.Name = "MainForm";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}

I've got it doing what your seeing now, I can't understand why its not doing a resize... i wonder if Doing a SendMessage will do the trick but i duno what message it would be.

the best work arround i can see if you do this:

imageList1.ImageSize = new Size(1,1);

I created a test one and it seemed to work unless I set the StateImageList. Are you clearing the StateImageList also?

Upvotes: 1

Related Questions