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

基于DataGridView选择显示图片时触发错误

问题分析与解决办法

嘿,这个问题我遇过类似的,大概率是筛选后代码没做必要的空值/有效性检查,再加上可能的列索引误区,才触发了异常。咱们一步步来搞定:

核心问题点

  1. 空引用风险:筛选数据后,DataGridView可能处于无选中行的状态,或者点击时CurrentRow为null,直接访问它的Cells会抛出空引用异常。
  2. 单元格值无效:筛选后的行中,目标列的单元格可能是DBNull.Value或者null,强行转换成byte[]会失败。
  3. 列索引误区:DataGridView的列索引是从0开始计数的!如果你的第18列是界面上的第18个可见列,它的实际索引应该是17,而非18——这可能是隐藏的致命错误(正常情况下数据源对应位置刚好有数据,筛选后就暴露问题了)。

修改后的代码

private void DGV_FEATURE_Click(object sender, EventArgs e)
{
    // 1. 先检查当前行是否存在
    if (DGV_FEATURE.CurrentRow == null)
    {
        PB_IMAGE.Image = null; // 清空图片框
        return;
    }

    // 2. 获取目标单元格的值:注意第18列的索引是17(0-based),请根据实际情况调整!
    var cellValue = DGV_FEATURE.CurrentRow.Cells[17].Value; 

    // 3. 检查单元格值是否有效(不是null也不是DBNull)
    if (cellValue == null || cellValue == DBNull.Value)
    {
        PB_IMAGE.Image = null;
        return;
    }

    // 4. 确保值是byte数组类型,再进行转换
    if (!(cellValue is byte[] imgBytes))
    {
        PB_IMAGE.Image = null;
        return;
    }

    // 5. 使用using语句自动释放MemoryStream资源,避免内存泄漏
    try
    {
        using (MemoryStream ms = new MemoryStream(imgBytes))
        {
            PB_IMAGE.Image = Image.FromStream(ms);
        }
    }
    catch (Exception ex)
    {
        // 捕获图片加载失败的异常,比如字节数组无效
        MessageBox.Show($"加载图片失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        PB_IMAGE.Image = null;
    }
}

额外优化建议

  • 别用硬编码的列索引,改用列名获取单元格,比如DGV_FEATURE.CurrentRow.Cells["ImageColumn"].Value,这样即使列顺序调整,代码也不会出错。
  • 如果筛选是通过DataTable.DefaultView实现的,确保筛选后的视图没有意外排除图片列的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:38