如何从数据库获取图像到Listview c#

时间:2017-12-28 16:35:06

标签: c# sql listview

我想在listview中显示数据库图像,但它不起作用。我试过,但任何人都无法帮助。

       ListViewItem liv = new ListViewItem(read[0].ToString());
                liv.SubItems.Add(read[1].ToString());
                liv.SubItems.Add(read[2].ToString());
                liv.SubItems.Add(read[3].ToString());
                listView1.Items.Add(liv);

这里在数据库中索引[3]存储的图像。

错误显示在图片

error System.Byte[]

2 个答案:

答案 0 :(得分:0)

    // To Convert you byte array to Images you need to convert it to a memory stream first
    // You will need to add:
    // using System.IO;
    // And you need to add an ImageList named "imageList1" to your form.
    // Then Initialize the ImageList object with images.

    for (int i = 0; i < read.Length; i++)
    {
        try
        {
            MemoryStream memStream = new MemoryStream(read[i]);
            this.imageList1.Images.Add(Image.FromStream(memStream));
        }
        catch
        { MessageBox.Show( "Image at index ( " + i.ToString() + " ) is not an image file"); }
    }

    //Now You can assign the ImageList objects to your ListView.

    this.listView1.View = View.SmallIcon;
    this.listView1.SmallImageList = this.imageList1;

    for (int j = 0; j < this.imageList1.Images.Count; j++)
    {
        ListViewItem liv = new ListViewItem();
        liv.ImageIndex = j;
        this.listView1.Items.Add(liv);
    }

答案 1 :(得分:0)

对于我所看到的,您的图像存储在数据库中并以ByteArray格式检索。您需要将ByteArray流转换为位图图像:

Image _image = new Bitmap(new MemoryStream((Byte[])read[3]));

由于必须在多个方法中引用此图像,因此请在类级别定义它。

using System.Drawing;
using System.Drawing.Text;

Image _image;

要让SubItem显示图像,您需要绘制yourselft项,因此设置ListView的OwnerDraw属性:

listView1.OwnerDraw = true;

从您的数据源获取项目:

(... LOOP ...)

//Define a new ListView Item...
ListViewItem _LVItem = new ListViewItem(read[0].ToString());
ListViewItem.ListViewSubItemCollection _ItemsCollection = 
             new ListViewItem.ListViewSubItemCollection(_LVItem);

//... and SubItems
_ItemsCollection.Add(new ListViewItem.ListViewSubItem(_LVItem, read[1].ToString()));
_ItemsCollection.Add(new ListViewItem.ListViewSubItem(_LVItem, read[2].ToString()));
//No text here, this is where the image will be drawn
_ItemsCollection.Add(new ListViewItem.ListViewSubItem(_LVItem, ""));

//Create a new Bitmap using a MemoryStream
_image = new Bitmap(new MemoryStream((Byte[])read[3]));

listView1.Items.Add(_LVItem);

(... LOOP ...)

listView1.DrawColumnHeaderlistView1.DrawSubItem

创建EventHandlers
//You need to draw both Headers...
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
   e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
   //Let the system draw these headers, nothing to do here
   e.DrawDefault = true;
}

//...  and SubItems
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
   //If this is the column where the image is shown, draw it
   if (e.ColumnIndex == 3)
   {
      //Position the image in the middle of its Column
      //This will be re-calculated when the Column is resized
      int _XLocation = (e.SubItem.Bounds.X + 
                       (e.SubItem.Bounds.Width / 2) - 
                       (e.SubItem.Bounds.Height / 2));

      //Draw the Image resized to the Height of the row
      e.Graphics.DrawImage(_image, new Rectangle(_XLocation, e.SubItem.Bounds.Y, e.SubItem.Bounds.Height, e.SubItem.Bounds.Height));
   }

   //Draw the other columns using their pre-defined values
   e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
   e.Graphics.DrawString(e.SubItem.Text, 
                         e.SubItem.Font, 
                         new SolidBrush(e.SubItem.ForeColor), 
                         e.SubItem.Bounds.Location.X, 
                         e.SubItem.Bounds.Location.Y);
}

这就是结果:

enter image description here