DataGridView默认错误对话框异常:System.FormatException问题咨询
嘿,我之前也碰到过类似的DataGridView格式化异常问题,结合你的场景给你捋捋可能的原因和解决办法:
问题分析
你遇到的System.FormatException: Formated value of the cell has a wrong type,本质是单元格实际存储的数据类型,和列配置的格式化规则不兼容,结合你的双DGV场景,大概率是这几个原因:
- DGV2的带状布局列(尤其是图片列)的类型配置和赋值不匹配
- DGV1排序后,迭代处理时不小心修改了单元格值的类型
- 列未显式指定
ValueType,导致DataGridView自动推断类型出错
解决步骤
1. 检查列的格式化规则与数据类型对齐
逐个核对两个DGV的列配置:
- 对于DGV1的常规数据列:如果设置了数值格式化(比如
{0:N2}),确保绑定的是int/decimal等数值类型,不能是字符串或null(空值用DBNull.Value代替) - 对于DGV2的图片列:必须赋值
Image对象,不能直接塞图片路径字符串或字节数组(如果是字节数组,要先转成Image再赋值)
2. 显式设置列的ValueType
不要依赖DataGridView自动推断类型,创建列时明确指定类型,避免隐性错误:
// DGV1的文件大小列(数值类型) DataGridViewTextBoxColumn sizeCol = new DataGridViewTextBoxColumn(); sizeCol.Name = "FileSize"; sizeCol.ValueType = typeof(long); sizeCol.DefaultCellStyle.Format = "N0"; // 格式化显示为整数 dgv1.Columns.Add(sizeCol); // DGV2的图片列 DataGridViewImageColumn imgCol = new DataGridViewImageColumn(); imgCol.Name = "ModelPreview"; imgCol.ValueType = typeof(Image); dgv2.Columns.Add(imgCol);
3. 定位具体出错的单元格
在迭代处理的代码里加局部捕获,精准找到问题单元格:
foreach (DataGridViewRow row in dgv1.Rows) { try { // 你的迭代处理逻辑,比如给DGV2赋值图片 string filePath = row.Cells["FilePath"].Value.ToString(); dgv2.Columns[row.Index].Cells[0].Value = LoadCADImage(filePath); } catch (FormatException ex) { // 输出出错位置,方便排查 Console.WriteLine($"出错行:{row.Index},列:{row.Cells["FilePath"].Name},错误:{ex.Message}"); } }
4. 基于原始数据源处理,而非DGV行
排序后DGV的Rows是视图层面的排序结果,直接遍历可能引发类型转换问题,建议直接操作绑定的原始数据源(比如DataTable):
// 假设DGV1绑定的是DataTable DataTable dt = (DataTable)dgv1.DataSource; // 先排序数据源 dt.DefaultView.Sort = "FileName ASC"; // 遍历排序后的数据源 foreach (DataRowView rowView in dt.DefaultView) { DataRow row = rowView.Row; // 处理逻辑... }
总结
这个异常90%都是「类型不兼容」导致的,先从列的ValueType和格式化规则入手检查,再通过局部捕获定位具体单元格,基本能快速解决问题。
内容的提问来源于stack exchange,提问作者Check Master
相关产品推荐
相关产品推荐

