在我点击DataGridViewCheckBoxColumn中的复选框来检查它并离开该单元格后,最近我得到了以下异常:
System.FormatException: “” is not valid for Boolean
这是DataGridView的完整错误对话框:
我甚至不知道我能找到哪个事件来找到这个问题的原因.在错误发生之前触发Validating和CellFormatting事件,但两者都会运行.
如果我处理DataError事件,我仍然无法弄明白. DataGridViewDataErrorEventArgs参数包含以下信息(以及其他信息):
e.ColumnIndex = 0 e.RowIndex = 0 e.Context = Commit
完整的异常(e.Exception.ToString())是:
System.FormatException: is not a valid value for Boolean. —>
System.FormatException: String was not recognized as a valid Boolean.
at System.Boolean.Parse(String value) at
System.ComponentModel.BooleanConverter.ConvertFrom(ITypeDescriptorContext
context,CultureInfo culture,Object value) — End of inner
exception stack trace — at
System.ComponentModel.BooleanConverter.ConvertFrom(ITypeDescriptorContext
context,Object value) at
System.ComponentModel.TypeConverter.ConvertFrom(Object value) at
System.Windows.Forms.DataGridView.DataGridViewDataConnection.PushValue(Int32
boundColumnIndex,Int32 columnIndex,Int32 rowIndex,Object value)
这是相关列属性的屏幕截图,该列具有ThreeState = false,并且没有为FalseValue,TrueValue或IndeterminateValue指定任何内容:
BindingSource的数据源是List< ErpService.ArrivalChargeAssignment>其中ArrivalChargeAssignment是我的WCF Web服务中的一个类,带有bool-field IsAssigned,因此它永远不能为null(甚至是空字符串).
解决方法
首先,我添加了一个DataGridViewCheckBoxColumn类型的列,并使用数据表填充了datagridview.我添加了一些空值的记录.
现在,它工作正常,数据显示正确,也没有给出任何错误.
然后我更改了CheckedBoxColumn的DefaultCellStyle属性,并从Nullvalue属性中删除了False值并再次启动它.
现在,应用程序显示错误.
我回到了DefaultCellStyle属性并重新设置了False值.然后我再次运行该项目.但是,它仍然向我显示同样的错误.
因此,加载了Form.designer.cs文件并检查了dataGridViewCellStyle1对象.我发现该属性设置为字符串类型值“False”而不是布尔类型false.
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; dataGridViewCellStyle1.NullValue = "False"; this.Column1.DefaultCellStyle = dataGridViewCellStyle1; this.Column1.HeaderText = "Check Box"; this.Column1.Name = "chkCol";
所以,我已按如下方式更新该行,并再次启动该项目.现在,错误消失了.
dataGridViewCellStyle1.NullValue = false;
当我创建DataGridViewCheckBoxColumn时,我发现没有为默认的单元格样式属性创建对象.因此,默认情况下NullValue属性采用false值.但是,在修改该属性后,已创建对象并为该属性分配字符串类型值.
更新:只需重新创建该列即可解决此问题.