You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# DataGridView绑定数据库Varbinary类型图片无法正常显示问题

问题成因
  • 列类型定义错误:创建DataTable时将Photo列的数据类型声明为string,但数据库Varbinary类型存储的图片读取后是byte[]字节数组,类型不匹配时系统会直接输出字节数组的默认字符串表现形式System.Byte[],也就是界面上显示的异常文本内容。
  • 未做二进制到图片的格式转换:DataGridView的图片列只能识别Image类型的对象,原始二进制字节数组无法被直接渲染为可视图片。
  • 冗余逻辑问题:代码中定义的pic查询全程未被使用,属于重复查询数据库的无效代码,可以直接删除。

datagridview运行异常效果

修改步骤
  1. 调整DataTable中Photo列的类型定义,替换掉错误的字符串类型,改为支持存储图片对象的类型。
  2. 遍历数据赋值时,将读取到的byte[]二进制内容转换为Image对象后再存入DataRow。
  3. 绑定DataTable到DataGridView时,确认Photo对应列为DataGridViewImageColumn类型;如果开启了自动生成列,只要列中存储的是Image类型,控件会自动生成适配的图片列。
修改后完整代码
// 需先引入对应命名空间
using System.IO;
using System.Drawing;

// 业务逻辑部分
DataClasses1DataContext dbMenu = new DataClasses1DataContext();
DataTable table = new DataTable();
// 移除冗余的重复查询,一次查询拿到所有需要的字段即可
var query = from s in dbMenu.Menus where s.Dish_ID == DishID select s;

table.Columns.Add("Dish_ID", typeof(string));
table.Columns.Add("Dish_Name", typeof(string));
table.Columns.Add("Price", typeof(string));
table.Columns.Add("Dish_Status", typeof(string));
// 修正Photo列的类型定义
table.Columns.Add("Photo", typeof(Image));

foreach (var item in query)
{
    DataRow dr = table.NewRow();
    dr["Dish_ID"] = item.Dish_ID;
    dr["Dish_Name"] = item.Dish_Name;
    dr["Price"] = item.Price;
    dr["Dish_Status"] = item.Dish_Status;
    
    // 将二进制字节数组转换为Image对象再赋值
    if (item.photo != null && item.photo.Length > 0)
    {
        using (MemoryStream ms = new MemoryStream(item.photo))
        {
            dr["Photo"] = Image.FromStream(ms);
        }
    }
    else
    {
        // 无图片时可赋值null,也可以自行加载默认占位图
        dr["Photo"] = null;
    }
    
    table.Rows.Add(dr);
}
return table;
补充说明

如果绑定后图片列显示尺寸、布局不符合预期,可以手动在DataGridView控件中添加DataGridViewImageColumn,将该列的DataPropertyName属性设置为Photo,调整好图片布局模式后关闭自动生成列功能即可。


内容的提问来源于stack exchange,提问作者Kirazuse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:54:12