簡體   English   中英

圖像未顯示在 vb.net 的 datagridview 列中

[英]Image not displaying in datagridview column in vb.net

我有以下代碼要用於在 DataGridView 單元格中顯示圖像:

dgvInventory.Item(7, i).Value = My.Resources.ResourceManager.GetObject("picture")

但它沒有顯示所需的圖像,而是在單元格中顯示System.Drawing.Bitmap

請注意 DataGridView 表是在運行時創建的,所以我知道我應該將列屬性更改為DataGridViewImageColumn但我就是不知道如何做。

提前致謝

請我真的需要幫助。

下面是完整代碼

con.Open()
tables.Clear()
dgvInventory.DataSource = tables
dgvInventory.DataSource = Nothing

sql = "SELECT ItemID, itemname, status, ''  FROM [" & InventoryTable & "]"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, InventoryTable)
con.Close() 

'This Loads Records into DataGrid
Dim view As New DataView(tables(0))
source1.DataSource = view
dgvInventory.DataSource = view
dgvInventory.AllowUserToAddRows = False

For i = 0 To dgvInventory.RowCount - 1
   If dgvInventory.Item(2, i).Value = 1 then
     dgvInventory.Item(3, i).Value = My.Resources.ResourceManager.GetObject("picture")
   Else
     dgvInventory.Item(3, i).Value = My.Resources.ResourceManager.GetObject("picture1")
   End If
Next

dgvInventory.Columns(0).HeaderText = "ID"
dgvInventory.Columns(1).HeaderText = "Item / Product / Service"
dgvInventory.Columns(2).HeaderText = "Status"
dgvInventory.Columns(3).HeaderText = "Icon"

dgvInventory.Columns(0).Width = 100
dgvInventory.Columns(1).Width = 300
dgvInventory.Columns(2).Width = 100
dgvInventory.Columns(3).Width = 100

dgvInventory.ClearSelection()

如果你得到類似的東西:

Q59232259-1

那是因為您正在獲取ToString函數為要在默認DataGridViewTextBoxCell顯示的Bitmap類型的實例返回的內容。 請注意, Icon不是您的DataTable的一部分,它只是您資源中的一個圖像。

相反,在設置 DGV 的DataSource屬性后添加一個新的DataGridViewImageColumn 請考慮以下示例:

'Class level variables
Private bmp1 As New Bitmap(My.Resources.picture)
Private bmp2 As New Bitmap(My.Resources.picture1)

在調用和顯示數據的方法中,將其替換為您的實際數據源。

Dim dt As New DataTable
dt.Columns.Add(New DataColumn("ID"))
dt.Columns.Add(New DataColumn("Item"))
dt.Columns.Add(New DataColumn("Status"))

For i As Integer = 1 To 10
    dt.Rows.Add(i, $"Item {i}", $"Status {i}")
Next

With dgvInventory
    .Clear()
    .DataSource = Nothing
    .DataSource = dt
    .Columns("Item").HeaderText = "Item / Product / Service"
End With

Dim imageColIndex As Integer = dgvInventory.Columns.Count
Dim imgCol As New DataGridViewImageColumn(False) With {
    .CellTemplate = New DataGridViewImageCell() With {
        .Style = New DataGridViewCellStyle() With {
            .Alignment = DataGridViewContentAlignment.MiddleCenter
        }
    },
    .DisplayIndex = imageColIndex,
    .Image = Nothing,
    .Name = "Image",
    .HeaderText = "Image",
    .Width = CInt(dgvInventory.RowTemplate.Height * 1.5),
    .DefaultCellStyle = New DataGridViewCellStyle() With {.NullValue = Nothing}
}

AddHandler dgvInventory.CellFormatting,
    Sub(obj, arg)
        If arg.ColumnIndex = imageColIndex Then
            arg.Value = If(arg.RowIndex Mod 2 = 0, bmp1, bmp2)
        End If
    End Sub

dgvInventory.Columns.Insert(imageColIndex, imgCol)

其中imageColIndex是圖像列的索引。

不要忘記在 From.Closing 事件中進行清理:

bmp1?.Dispose()
bmp2?.Dispose()

你會得到類似的東西:

Q59232259-2

請注意,您不需要在設計時添加列,您可以在綁定DataTableDataViewBindingSource后編輯列屬性。 到您的 DGV。

在您的代碼中實現它:

tables.Clear()
con.Open()
sql = "SELECT ItemID, itemname, status, ''  FROM [" & InventoryTable & "]"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, InventoryTable)
con.Close()
con.Dispose()

Dim view As New DataView(tables(0))
source1.DataSource = view

With dgvInventory
    .Columns.Clear()
    .DataSource = Nothing
    .DataSource = view
    .Columns(0).HeaderText = "ID"
    .Columns(0).Width = 100
    .Columns(1).HeaderText = "Item / Product / Service"
    .Columns(1).Width = 300
    .Columns(2).HeaderText = "Status"
    .Columns(2).Width = 100
End With

Dim imageColIndex As Integer = dgvInventory.Columns.Count
Dim imgCol As New DataGridViewImageColumn(False) With {
    .CellTemplate = New DataGridViewImageCell() With {
    .Style = New DataGridViewCellStyle() With {
    .Alignment = DataGridViewContentAlignment.MiddleCenter
}
},
.DisplayIndex = imageColIndex,
.Image = Nothing,
.Name = "Icon",
.HeaderText = "Icon",
.Width = CInt(dgvInventory.RowTemplate.Height * 1.5),
.DefaultCellStyle = New DataGridViewCellStyle() With {.NullValue = Nothing}
}

AddHandler dgvInventory.CellFormatting,
    Sub(obj, arg)
        If arg.ColumnIndex = imageColIndex Then
            Dim status As Integer = Convert.ToInt32(
            DirectCast(obj, DataGridView).Item(2, arg.RowIndex).Value)

            arg.Value = If(status = 1, bmp1, bmp2)
        End If
    End Sub

dgvInventory.Columns.Insert(imageColIndex, imgCol)
dgvInventory.ClearSelection()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM