Hemerson
Hemerson

Reputation: 21

datagridview Image Display vb.net MS Access

my code is to read the image file path in every row and display it in the datagridview "Image" Column.

.....

what's the problem with my code? please help me fix this.

UPDATE

this is the updated code but it displays nothing.

Dim dbdataset As New DataTable
        Try
            con.Open()
            query = "Select * FROM [svfmemberlist]"
            cmd = New OleDbCommand(query, con)
            da.SelectCommand = cmd
            da.Fill(dbdataset)
            dgvSearch.RowTemplate.Height = 150
            source.DataSource = dbdataset
            dgvSearch.DataSource = source

            Dim img As New DataGridViewImageColumn()
            dgvSearch.Columns.Add(img)
            img.HeaderText = "Image"
            img.Name = "img"
            img.ImageLayout = DataGridViewImageCellLayout.Zoom
            dgvSearch.Columns("img").DataGridView.AutoGenerateColumns = False
            dgvSearch.Columns("Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            dgvSearch.Columns("img").Width = 150
            For Each row As DataGridViewRow In dgvSearch.Rows
                If Not row.Cells("imgPath").FormattedValue.ToString = Nothing Then
                    Dim str As String = row.Cells("imgPath").FormattedValue.ToString
                    Dim inImg As Image = Image.FromFile(str)
                    row.Cells("img").Value = inImg
                Else
                    img.Image = Nothing
                End If
            Next
            con.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

enter image description here

Upvotes: 0

Views: 1110

Answers (1)

Karen Payne
Karen Payne

Reputation: 5102

The following example does not match how you are loading data and images but with a little effort will work within your current code.

I created two columns in the DataGridView via the IDE, one Text and one Image DataGridViewColumn.

The first line in form load sets ImageLayout, second line of code sets alignment to top-left for appearances. Next I set auto-size mode for all columns followed by setting the row height for each row.

Next (these lines are to load images from a folder one level below the app folder).

Setup the path to the images. Add images using FileImageBytes function (which I would place into a separate class or code module but works just fine in your form).

Yes everything is hard-wired so it's easy to see how everything works.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CType(DataGridView1.Columns("PictureColumn"), DataGridViewImageColumn).ImageLayout = DataGridViewImageCellLayout.Normal
        DataGridView1.Columns.Cast(Of DataGridViewColumn).Select(Function(col) col).ToList _
            .ForEach(Sub(col) col.CellTemplate.Style.Alignment = DataGridViewContentAlignment.TopLeft)
        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        DataGridView1.RowTemplate.Height = 222
        Dim imagePath As String = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images")
        DataGridView1.Rows.Add(New Object() {"Car1", FileImageBytes(IO.Path.Combine(imagePath, "Car1.bmp"))})
        DataGridView1.Rows.Add(New Object() {"Car2", FileImageBytes(IO.Path.Combine(imagePath, "Car2.jpg"))})
    End Sub
    Public Function FileImageBytes(ByVal FileName As String) As Byte()
        Dim fileStream As IO.FileStream = New IO.FileStream(FileName, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
        Dim byteArray(CInt(fileStream.Length - 1)) As Byte
        fileStream.Read(byteArray, 0, CInt(fileStream.Length))
        Return byteArray
    End Function
End Class

Upvotes: 1

Related Questions