2017-01-18 28 views
0

データベースからリストビューを作成しようとしていますが、各行はパスから取得したイメージを表示しています。それは動作し、画像は行に表示されますが、問題はすべてのリスト項目に同じ画像が表示されることです。したがって、すべてのエントリに対して最初のデータベースエントリのイメージが使用されます。イメージリストには1つのイメージしか表示されません

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 }); 
} 

答えて

3

あなたはそれらのすべての間で同じイメージリストオブジェクトを共有している: はここで検索して画像を表示するコードです。ループを開始する前に作成し、最後に別のイメージを追加しますが、リスト内の最初のイメージを使用するように新しいリストビューアイテムを常に指示します。毎回同じリストオブジェクトなので、毎回同じ最初のイメージです。

あなただけの項目ごとに新しいイメージリストを作成することができます。

 while (reader.Read()) { 
      // Create a new one each time. 
      ImageList imgList = new ImageList(); 

      ListViewItem item = new ListViewItem(reader.GetString(0), 0); 

それとも、それらのすべてに同じイメージリストを使用しますが、1だけので、各行の使い方をするたびに画像インデックスを増加させることができますそれ自身のイメージ。

すべては同じでも、あなたが設定した行はそのままです。ImageIndex。 1つを減算して、1つの画像がある場合はインデックス0、2つの場合はインデックス1を取得してください。

  // First one gets image 0, second one image 1, etc. 
      item.ImageIndex = imgList.Images.Count - 1; 
関連する問題