Как вернуть изображение недвижимости в ListView? - PullRequest
0 голосов
/ 25 ноября 2008

Окр .: VS 2008, .NET 2.0, WinForms

У меня есть список в режиме Tile. С некоторыми предметами связано изображение. Некоторые нет.

Содержимое (элементы списка) часто обновляется, когда пользователь нажимает некоторые элементы управления. Когда это происходит, иногда кажется, что ни у одного из новых предметов нет изображений. В этом случае я бы хотел избавиться от пустого пространства слева от предметов, зарезервированных для изображений. Я попытался следующий псевдокод, чтобы временно избавиться от списка изображений

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

Но это не работает: пустое пространство все еще там. Я также пытаюсь перекрасить элемент управления, но безрезультатно.

альтернативный текст http://apptranslator.com/_so/so_list1.jpg альтернативный текст http://apptranslator.com/_so/so_list2.jpg альтернативный текст http://apptranslator.com/_so/so_list3.jpg

Слева: список с изображениями.

Середина: список без изображений. Место для изображений видно.

Справа: как бы мне этого хотелось, когда нет изображений.

EDIT: Я также сделал этот тест: не назначайте список изображений в дизайнере. Если на первом дисплее нет изображений, я получаю ожидаемый результат. Затем я нажимаю для отображения изображений (я их получаю). Я нажимаю еще раз, чтобы вернуться к выбору без изображений: пространство изображений не исчезает.

Кроме того, нет, я не использую маленькие изображения или изображения состояний. Только большие изображения.

Что я могу сделать? ТИА.

Ответы [ 3 ]

1 голос
/ 25 ноября 2008

Ты уверен? У меня это работает в этом тестовом примере:

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());
    }
}

У меня есть то, что вы видите сейчас, я не могу понять, почему не происходит изменение размера ... Интересно, будет ли делать SendMessage, но я не знаю, какое это будет сообщение.

лучшая работа, которую я могу увидеть, если вы сделаете это:

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

Я создал тестовую версию, и она работала, если я не установил StateImageList. Вы очищаете StateImageList также?

0 голосов
/ 05 января 2010

Недавно у меня тоже возникла эта проблема. Что-то, что я заметил, это то, что независимо от того, какой параметр LargeImageList ImageSize установлен (или даже если LargeImageList равен NULL!), ListView всегда будет действовать так, как если бы LargeImageList.ImageSize по-прежнему был установлен на свое последнее значение.

В моей программе я вообще не использовал SmallImageList, поэтому он все время был NULL. В моем конструкторе для формы я просто установил это в новый ImageList () для ListView и зафиксировал размер в at (1,1). Проблема ушла! Похоже на глупую ошибку.

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

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

        RefreshItems();
    }
0 голосов
/ 29 сентября 2009

Если вы хотите получить полный контроль, используйте событие listview.drawitem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...