DataGridView图像未显示在未绑定列中

时间:2013-06-03 11:08:48

标签: c# winforms datagridview

我有一个绑定到DataTable的DataGridView,我想要添加一个Avatar列。该列将是未绑定的。我正在使用以下代码来执行此操作:

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");

2 个答案:

答案 0 :(得分:1)

拥有CellFormatting事件处理程序是不必要的! http://csharp.net-informations.com/datagridview/csharp-datagridview-image.htm中给出的非常简单的示例完美地工作。 首先,注意拍摄小图像(f.i. 100 x 100像素) 如果图像未“显示”,则放大“图像列”。

答案 1 :(得分:0)

解决:好的唐的链接基本上是正确的。看来你必须使用格式化事件,如下所示:

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;
        }              
    }
}