我正在尝试用数据库填充listview,每行显示从路径中检索的图像。它工作,图像显示在行中,但问题是每个列表项显示相同的图像。因此,它使用第一个数据库条目中的图像来表示所有条目。 以下是检索和显示图像的代码:
DataTable tab = myConn.GetSchema("Tables");
foreach (DataRow row in tab.Rows) {
Console.WriteLine("{0}", row["TABLE_NAME"].ToString());
}
string mySelectQuery = "Select * from staff";
OdbcCommand command = new OdbcCommand(mySelectQuery, myConn);
OdbcDataReader reader = command.ExecuteReader();
ImageList imgList = new ImageList();
while (reader.Read()) {
ListViewItem item = new ListViewItem(reader.GetString(0), 0);
item.SubItems.Add(reader.GetString(1));
item.SubItems.Add(reader.GetString(2));
// gets image from path in db
imgList.Images.Add(Image.FromFile(reader.GetString(3)));
listView1.SmallImageList = imgList;
item.SubItems.Add(reader.GetString(4));
item.ImageIndex = 0;
listView1.Items.AddRange(new ListViewItem[] { item });
}
答案 0 :(得分:3)
您在所有这些对象中共享相同的imageList对象。您在进入循环之前创建它,然后在每次迭代时,您将另一个图像添加到结尾,但是您总是告诉每个新的listview项目使用列表中的第一个图像。因为每次都是相同的列表对象,所以每次都是相同的第一个图像。
您可以为每个项目创建一个新图像列表:
while (reader.Read()) {
// Create a new one each time.
ImageList imgList = new ImageList();
ListViewItem item = new ListViewItem(reader.GetString(0), 0);
或者您可以对所有这些图像列表使用相同的图像列表,但每次将图像索引增加一,因此每行使用自己的图像。
一切都会保持不变,但是你设置的行ImageIndex
。一定要减去一个,所以当有一个图像时得到索引0,当有两个图像时得到索引1,等等。
// First one gets image 0, second one image 1, etc.
item.ImageIndex = imgList.Images.Count - 1;