基于DataGridView选择显示图片时触发错误
问题分析与解决办法
嘿,这个问题我遇过类似的,大概率是筛选后代码没做必要的空值/有效性检查,再加上可能的列索引误区,才触发了异常。咱们一步步来搞定:
核心问题点
- 空引用风险:筛选数据后,DataGridView可能处于无选中行的状态,或者点击时
CurrentRow为null,直接访问它的Cells会抛出空引用异常。 - 单元格值无效:筛选后的行中,目标列的单元格可能是
DBNull.Value或者null,强行转换成byte[]会失败。 - 列索引误区: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
相关产品推荐
相关产品推荐

