我在 ListView 中动态添加的图像显示为黑色方块,Windows 表单

Images I dynamically added in a ListView are displaying as a black square, Windows Forms

当我通过存储在 SQL 服务器数据库中的数据填充 ListView 时,无论我如何处理我试图填充的图像列表,都不会显示图像,而是显示实际图像应该所在的黑色方块。

我已经尝试了所有的图像列表类型和列表视图上的视图类型,但它们都以同样的方式失败。

这是我尝试填充它的方式:

public ListView List_Of_Albums(ListView LV)
    {
        LV.Clear();
        LV.Columns.Add("Album Name", 233);
        LV.View = View.Details;
        ImageList imgs = new ImageList();
        LV.SmallImageList = imgs;
        LV.BringToFront();
        imgs.ImageSize = new Size(108, 93);
        LV.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        try
        {
            ConexionDB();
            SqlCommand cmd = new SqlCommand("spSelect_Albums", cnx);
            cmd.Connection = cnx;
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            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);
                    }
                    var LVItem = new ListViewItem(row);
                    LV.Items.Add(LVItem);
                }
            }
            cnx.Close();
            return LV;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Database execution error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return LV;
        }
    }

然而结果总是这样:

我已经确认用作路径的字符串是有效的,如果我将垃圾字符串作为源,它确实会给我一个找不到的文件。

Did ou set the LVI's image index? – TaW

就是这样,非常感谢,如果有人有类似的问题,这就是我使用上面示例中使用的相同 while 循环分配图像索引的方式。

public ListView List_Of_Albums(ListView LV)
    {
        int imgCount = 0; // HERE
        LV.Clear();
        LV.Columns.Add("Album Name", 333);
        LV.View = View.LargeIcon;
        ImageList imgs = new ImageList();
        LV.LargeImageList = imgs;
        LV.BringToFront();
        imgs.ImageSize = new Size(108, 93);
        LV.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        try
        {
            ConexionDB();
            SqlCommand cmd = new SqlCommand("spSelect_Albums", cnx);
            cmd.Connection = cnx;
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            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()
                    };
                    var LVItem = new ListViewItem(row);
                    LV.Items.Add(LVItem);
                    try
                    {
                        imgs.Images.Add(Image.FromFile(dr.GetValue(4).ToString()));
                        LV.Items[imgCount].ImageIndex = imgCount; //counts up
                    }
                    catch (Exception)
                    {
                        imgs.Images.Add(Properties.Resources.No_Art); // no image if it can't find one
                        LV.Items[imgCount].ImageIndex = -1;
                    }
                    imgCount++;
                }
            }
            cnx.Close();
            return LV;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Database execution error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return LV;
        }
    }