我在 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;
}
}
当我通过存储在 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;
}
}