C#WinForms-ListViewItem图像未显示

问题描述

我遇到一个相当琐碎的问题,即每个ListViewItem都没有显示图像。每个服务名称旁边应有一个图像,但没有显示Application.EnableVisualStyles();已打开。我尝试将资源图像设置为PictureBox作为测试,但效果很好。在设计器中都添加了两个列标题。为每个项目正确设置了索引,还尝试了分配ImageKey

在这里已经阅读了多个类似的问题,但是没有一个可以解决这个问题。

在加载时完成ImageList的初始化

    ImageList servicelogoList = new ImageList
    {
        ImageSize = new Size(32,32),ColorDepth = ColorDepth.Depth32Bit
    };

    servicelogoList.Images.Add(Properties.Resources.drive_logo);
    servicelogoList.Images.Add(Properties.Resources.dropBox_logo);
    servicelogoList.Images.Add(Properties.Resources.seeyou_logo);

    listViewdisablableItemsServices.View = View.Details;
    listViewdisablableItemsServices.LargeImageList = servicelogoList;
    listViewdisablableItemsServices.SmallImageList = servicelogoList;

将图像分配给每一行

foreach (var service in _services)
{
    if (service.ServiceType == Constants.SERVICE_TYPE_STORAGE)
    {
        ListViewItem item = new ListViewItem(service.Label);
        item.SubItems.Add(service.ErrorOrInterpretedError ?? Lang.GetString("Common_OK"));
        item.Tag = service;

        switch (service.ServiceName)
        {
            case "google":
                item.ImageIndex = 0;
                break;
            case "dropBox":
                item.ImageIndex = 1;
                break;
            case "seeyou":
                item.ImageIndex = 2;
                break;
        }

        listViewdisablableItemsServices.Items.Add(item);

        if (!service.IsAuthenticatedAndAvailable)
        {
            listViewdisablableItemsServices.disableItem(item);
        }
    }
}

应该在哪里显示图像

Location of images

解决方法

我试图创建一个类似的winform项目,并且可以正常工作。

我的示例代码:

ImageList serviceLogoList = new ImageList
{
    ImageSize = new Size(32,32),ColorDepth = ColorDepth.Depth32Bit
};

serviceLogoList.Images.Add(Properties.Resources.p1);
serviceLogoList.Images.Add(Properties.Resources.p2);

listViewDisablableItemsServices.View = View.Details;
listViewDisablableItemsServices.LargeImageList = serviceLogoList;
listViewDisablableItemsServices.SmallImageList = serviceLogoList;


ListViewItem item1 = new ListViewItem("test1");
item1.ImageIndex = 0;
item1.SubItems.Add("XD1");

ListViewItem item2 = new ListViewItem("test2");
item2.ImageIndex = 1;
item2.SubItems.Add("XD2");

listViewDisablableItemsServices.Items.Add(item1);
listViewDisablableItemsServices.Items.Add(item2);

我认为您没有输入switch来设置ImageIndex。您可以添加调试来检查是否设置了ImageIndex

,

我认为您缺少添加列

listViewDisablableItemsServices.Columns.Add("Name",100);
listViewDisablableItemsServices.Columns.Add("Status",100);

我正在根据您的示例发布工作代码

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
    List<StorageService> _services = new List<StorageService>();
    public Form1()
    {
        InitializeComponent();
        initializeListView();
    }

    private void Form1_Load(object sender,EventArgs e)
    {
        LoadServices();
        listViewDisablableItemsServices.Columns.Add("Name",100);
        listViewDisablableItemsServices.Columns.Add("Status",100);
        foreach (var service in _services)
        {
            if (service.ServiceType == Constants.SERVICE_TYPE_STORAGE)
            {
                ListViewItem item = new ListViewItem(service.Label);
                
                item.SubItems.Add(service.ErrorOrInterpretedError ?? Lang.GetString("Common_OK"));
                item.Tag = service;

                switch (service.ServiceName)
                {
                    case "google":
                        item.ImageIndex = 0;
                        break;
                    case "dropbox":
                        item.ImageIndex = 1;
                        break;
                    case "seeyou":
                        item.ImageIndex = 2;
                        break;
                }

                listViewDisablableItemsServices.Items.Add(item);

                if (!service.IsAuthenticatedAndAvailable)
                {
                    //listViewDisablableItemsServices.DisableItem(item);
                }
            }
        }
    }

    private void LoadServices()
    {
        _services.Add(new StorageService
        {
            ServiceType = "Storage",Label = "Google",ServiceName = "google",IsAuthenticatedAndAvailable = false,ErrorOrInterpretedError = "Sign up required"
        });
        _services.Add(new StorageService
        {
            ServiceType = "Storage",Label = "Drop box",ServiceName = "dropbox",IsAuthenticatedAndAvailable = true
        });
        _services.Add(new StorageService
        {
            ServiceType = "Storage",Label = "See You",ServiceName = "seeyou",IsAuthenticatedAndAvailable = true
        });
    }

    private void initializeListView()
    {
        ImageList serviceLogoList = new ImageList
        {
            ImageSize = new Size(32,ColorDepth = ColorDepth.Depth32Bit
        };

        serviceLogoList.Images.Add(Properties.Resources.drive_logo);
        serviceLogoList.Images.Add(Properties.Resources.dropbox_logo);
        serviceLogoList.Images.Add(Properties.Resources.seeyou_logo);

        listViewDisablableItemsServices.View = View.Details;
        listViewDisablableItemsServices.LargeImageList = serviceLogoList;
        listViewDisablableItemsServices.SmallImageList = serviceLogoList;
    }
}

class StorageService
{
    public string ServiceType { get; set; }

    public string ServiceName { get; set; }

    public string Label { get; set; }

    public string ErrorOrInterpretedError { get; set; }

    public bool IsAuthenticatedAndAvailable { get; set; }
}

class Constants
{
    public const string SERVICE_TYPE_STORAGE = "Storage";
}

class Lang
{
    public static string GetString(string key)
    {
        return "OK";
    }
}
}

Screen shot

,

在我的原始代码中删除然后重新添加ListView组件可以解决此问题。重新添加后,Visual Studio也已重新启动。