2

我有一个 DataGridView 绑定到我想要添加 Avatar 列的 DataTable。该列是未绑定的。我正在使用以下代码来做到这一点:

if (MyIcons != null)
{
    DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();

    imageColumn.Name = "Avatar";
    imageColumn.HeaderText = "";
    imageColumn.DefaultCellStyle.NullValue = null;

    ViewRolesDataGrid.Columns.Insert(0, imageColumn);

    foreach (DataGridViewRow row in ViewRolesDataGrid.Rows)
    {
        Guid iconGuid = (Guid)row.Cells["ID_Picture"].Value;

        if (MyIcons.Icons32x32.ContainsKey(iconGuid))
        {
            Image bm = MyIcons.Icons32x32[iconGuid];

            DataGridViewImageCell cell = row.Cells["Avatar"] as DataGridViewImageCell;

            cell.Value = MyIcons.Icons32x32[iconGuid];
        }
    }
}

MyIcons 是一个包含字典集的类,这些字典将 ID_Picture guid 从数据库散列到先前获取和缓存的实际图像(因此每次执行查询并将图像数据发回时,我不必加入图像表)。我已验证 MyIcons 缓存已实例化,并且它包含图像。上面的图像“bm”包含一个 32x32 32 位图。

当我运行我的程序时,未绑定的图像列在视图中可见,但没有呈现图像。它的行为就好像该值为 null(DefaultCellStyle.NullValue 更改会产生影响)。如果我对图像表进行完全连接以创建在 DataTable 中与图像绑定的列,则会显示图像。

谁能发现我的错误?

谢谢。

编辑:如果我直接将位图分配给单元格,它甚至不起作用,即我仍然没有在该列中显示任何内容:

cell.Value = Bitmap.FromFile("picture_32x32.png");
4

2 回答 2

1

已解决:OK Don 的链接基本上是正确的。看来您必须使用格式化事件来执行此操作,如下所示:

private void ViewRolesDataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (ViewRolesDataGrid.Columns[e.ColumnIndex].Name == "Avatar")
    {
        DataGridViewRow row = ViewRolesDataGrid.Rows[e.RowIndex];

        Guid iconGuid = (Guid)row.Cells["ID_Picture"].Value;

        Image icon = null;

        if (MyIcons.Icons32x32.ContainsKey(iconGuid))                
        {
            icon = (Image)MyIcons.Icons32x32[iconGuid];
        }

        if(icon != null)
        {
            DataGridViewImageCell cell = row.Cells["Avatar"] as DataGridViewImageCell;

            cell.Value = icon;
        }              
    }
}
于 2013-06-03T14:56:25.250 回答
1

不必拥有 CellFormatting 事件处理程序!http://csharp.net-informations.com/datagridview/csharp-datagridview-image.htm中给出的非常简单的示例非常有效。首先,注意有一个小图像(fi 100 x 100 像素)如果图像没有“显示”,请放大“图像列”。

于 2013-12-10T09:38:36.800 回答