问题描述
我遇到一个相当琐碎的问题,即每个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);
}
}
}
应该在哪里显示图像
解决方法
我试图创建一个类似的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";
}
}
}
,
在我的原始代码中删除然后重新添加ListView
组件可以解决此问题。重新添加后,Visual Studio也已重新启动。