ImageList仅显示一个图像

时间:2017-01-18 19:38:03

标签: c# .net winforms

我正在尝试用数据库填充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 });
}

1 个答案:

答案 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;