kh medo Ответов: 2

Как я могу отображать изображения из базы данных в listview в C#?


if (cn.State == ConnectionState.Open)
            {
                cn.Close();
            }
            cn.Open();
            listView1.Clear();
            ImageList images = new ImageList();
            images.ColorDepth = ColorDepth.Depth32Bit;
            listView1.LargeImageList = images;
            listView1.LargeImageList.ImageSize = new System.Drawing.Size(255, 255);
            cmd.Connection = cn;
            cmd.CommandText = "select * from table6";
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable dt = new DataTable();
            da.SelectCommand = cmd;
            dt.Clear();
            da.Fill(dt);
            foreach (DataRow row in dt.Rows)
            { 
                var image_buffer = (byte[])(row["picture"]);
                 MemoryStream image_stream = new MemoryStream(image_buffer);
                 image_stream.Write(image_buffer, 0, image_buffer.Length);
                images.Images.Add(row["picture"].ToString(), new Bitmap(image_stream));
           image_stream.Close();
                ListViewItem listItem = new ListViewItem();
                 listItem.Text = row["id"].ToString();            //t
                listItem.ImageKey = row["picture"].ToString();
                listView1.Items.Add(listItem);
      
            }


Что я уже пробовал:

этот код отображает только первое изображение в базе данных я хочу отобразить все

#realJSOP

Возможно, в таблице 6 есть только одна строка данных.

kh medo

не десять строк

2 Ответов

Рейтинг:
1

Eric Lynch

Ваша самая большая проблема-это ключ изображения, который вы выбрали. Попробуйте добавить эту строку в отладчик и проверить значение ключа:

string key = row["picture"].ToString()

Я подозреваю, вы обнаружите, что это всегда так. "System.Byte[]" или что-то похожее. Я предполагаю, что вы продолжаете переписывать (и отображать) одно и то же изображение, потому что вы продолжаете использовать один и тот же ключ изображения.

Вы должны убедиться, что используете уникальный ключ для каждого изображения. Я не уверен в типе данных row["id"]. Он может удовлетворить ваши потребности...попробуйте изучить его ToString ценность. Если это не очень хорошо, вы всегда можете просто добавить счетчик строк и использовать его значение.

Тем не менее, я беспокоюсь о некоторых других проблемах. Я надеюсь, что вы просто вырезаете какой-то быстрый тестовый код. В противном случае вы упускаете целую кучу using заявления и Dispose телефонные переговоры).

Надеюсь, это поможет. Удачи.
-Эрик.


Christiaan van Bergen

Я думаю, что @Eric прав. Линия :

изображения.Изображения.Добавить(строка["картинка"].Метод toString(), новый точечный рисунок(image_stream));

добавит изображения в коллекцию с тем же ключом, поэтому только один Листитем будет совпадать с изображением и отображать его.

Это все достаточно печально, что объект imagelist.Программа imagecollection.Метод Add не вызывает исключения DuplicateKeyException, иначе вы нашли бы его раньше.

Рейтинг:
0

George Swan

Использовать ListView с собой UniformGrid в ItemsPanelTemplate. Я использовал следующие действия, чтобы отобразить 52 игральных карт. Вам нужно, конечно, сначала заполнить коллекцию. Это для приложения WPF


<Grid HorizontalAlignment="Center"  >

           <ListView   ItemsSource="{Binding CardCollection }" >
               <ListView.ItemTemplate>
                   <DataTemplate >
                       <Grid HorizontalAlignment="Center" >
                           <Image   Source="{Binding CardGraphic}" />
                       </Grid>
                   </DataTemplate>
               </ListView.ItemTemplate>
               <ListView.ItemsPanel >
                   <ItemsPanelTemplate>
                       <UniformGrid Columns="13" HorizontalAlignment="Center"  />
                   </ItemsPanelTemplate>
               </ListView.ItemsPanel>
           </ListView>

       </Grid>


Wendelius

Основываясь на свойствах, я предполагаю, что речь идет о Windows.Формы

George Swan

Я не пользовался окнами.Формы в годах. Я оставлю его на случай, если кто-то сочтет его полезным. Спасибо