我有一个绑定到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");
答案 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;
}
}
}