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

C#如何在DataGridView列展示图片并解决列宽适配与空引用报错问题

问题解决方法

1. 空引用报错修复

出现空报错的根本原因是访问foto列的时机早于DataGridView绑定数据源的时机:
你在执行dtgvOfertas.DataSource = dt之前就尝试获取dtgvOfertas.Columns["foto"],此时DataGridView还未根据DataTable的结构生成对应列,拿到的是null值,调用属性就会触发空引用异常。
只需要调整代码顺序,把操作foto列的代码放到绑定数据源之后即可。

2. 列宽布局问题修复

图片列尺寸适配

要求图片列尺寸不小于图片本身大小,只需要给图片列设置MinimumWidth属性为你图片的宽度(300),再搭配合适的自适应模式即可。

其余列宽冗余修复

将其余列的自适应模式设置为DataGridViewAutoSizeColumnMode.AllCells,即可让列宽自动匹配内容实际宽度,不会出现冗余空白。

修正后完整代码

private void cargadatos()
{
    try
    {
        conectar();
        MySqlCommand cmd = new MySqlCommand("SELECT codigo," +
            " nombre, Id_Familia, precio" +
            " from OFERTAS  ORDER BY Id_Familia, codigo asc;", conn);
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        dt.Columns.Add("foto", Type.GetType("System.Byte[]"));
        
        foreach (DataRow drow in dt.Rows)
        {
            try
            {
                WebClient wc = new WebClient();
                byte[] bytes = wc.DownloadData("http://encuadernadores4.synology.me/somisata/fotos_articulos/"+drow["codigo"].ToString()+".jpg");
                MemoryStream ms = new MemoryStream(bytes);
                System.Drawing.Image img = System.Drawing.Image.FromStream(ms);

                Bitmap bitmap=new Bitmap(img);
                Image resizedImage = resizeImage(bitmap, new Size(300, 300));

                drow["foto"] = imageToByteArray(resizedImage);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        dtgvOfertas.RowTemplate.Height = 300; 
        dtgvOfertas.DefaultCellStyle.WrapMode = DataGridViewTriState.True; 
        // 先绑定数据源
        dtgvOfertas.DataSource = dt;
        // 绑定完成后再操作列属性
        dtgvOfertas.Columns["foto"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        dtgvOfertas.Columns["foto"].MinimumWidth = 300; 
        // 其他列自适应内容宽度
        for (int i = 0; i < dtgvOfertas.ColumnCount; i++)
        {
            if (dtgvOfertas.Columns[i].Name != "foto")
            {
                dtgvOfertas.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
            dtgvOfertas.Columns[i].DefaultCellStyle.Alignment = 
                DataGridViewContentAlignment.MiddleCenter;
            dtgvOfertas.Columns[i].HeaderCell.Style.Alignment = 
                DataGridViewContentAlignment.MiddleCenter;
        }      
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    desconectar();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:45:03