Windows Forms ListView动态添加ImageList图片显示为黑方块问题求助
故障根因及修复方案
核心问题点
- ImageList属性配置顺序错误。WinForm中
ImageList一旦绑定到ListView等控件后,再修改ImageSize、ColorDepth属性会导致内部图像句柄异常,最终渲染为黑色方块。原代码先执行了LV.SmallImageList = imgs,后设置imgs.ImageSize,直接触发了该问题。 - ListViewItem未关联ImageList索引。往ImageList中添加图片后,创建ListViewItem时未指定
ImageIndex属性,ListView无法匹配对应位置的图片进行渲染。
修复后的代码
public ListView List_Of_Albums(ListView LV) { LV.Clear(); LV.Columns.Add("Album Name", 233); LV.View = View.Details; // 先完全配置ImageList所有属性,再加图、再绑定到ListView ImageList imgs = new ImageList(); // 显式设置色深,兼容透明/半透明图片 imgs.ColorDepth = ColorDepth.Depth32Bit; imgs.ImageSize = new Size(108, 93); // 所有属性配置完成后再绑定到ListView LV.SmallImageList = imgs; LV.BringToFront(); try { ConexionDB(); SqlCommand cmd = new SqlCommand("spSelect_Albums", cnx); cmd.Connection = cnx; cmd.CommandType = CommandType.StoredProcedure; using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { string[] row = { dr.GetValue(2).ToString(), dr.GetValue(0).ToString(), dr.GetValue(1).ToString(), dr.GetValue(3).ToString(), dr.GetValue(4).ToString(), dr.GetValue(5).ToString(), dr.GetValue(6).ToString(), dr.GetValue(7).ToString(), dr.GetValue(8).ToString(), dr.GetValue(9).ToString() }; try { imgs.Images.Add(Image.FromFile(dr.GetValue(4).ToString())); } catch (Exception) { imgs.Images.Add(Properties.Resources.No_Art); } // 指定当前项对应ImageList的索引,刚添加的图片索引为总数-1 var LVItem = new ListViewItem(row, imgs.Images.Count - 1); LV.Items.Add(LVItem); } } cnx.Close(); // 列自适应放到数据填充完成后执行 LV.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); return LV; } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "Database execution error", MessageBoxButtons.OK, MessageBoxIcon.Error); return LV; } }
额外排查点
如果修改后仍有异常,可按以下顺序验证:
- 确认读取的图片格式为WinForm GDI+支持的格式(jpg、png、bmp等,不支持webp、heic等非常规格式)
- 确认
Properties.Resources.No_Art资源的尺寸和色深与ImageList配置匹配,避免单张异常图片影响整体渲染
内容的提问来源于stack exchange,提问作者Carcass696
相关产品推荐
相关产品推荐

