DataGridViewCheckBoxColumn:布尔列上的FormatException

时间:2014-11-05 15:34:10

标签: c# .net winforms datagridview formatting

我甚至不知道在哪里修复此错误。 最近,我点击DataGridViewCheckBoxColumn中的复选框进行检查并离开该单元格后,我发现以下异常:

  

System.FormatException:""对布尔

无效

这是DataGridView

中的完整错误对话框

enter image description here

我甚至不知道我能找到哪个事件来找到这个问题的原因。错误之前会触发ValidatingCellFormatting事件,但两者都会运行。 如果我处理DataError - 事件,我仍然无法弄明白。 DataGridViewDataErrorEventArgs参数包含以下信息(其中包括):

e.ColumnIndex = 0 
e.RowIndex    = 0 
e.Context     = Commit

完整的例外(e.Exception.ToString())是:

  

System.FormatException:不是Boolean的有效值。 --->   System.FormatException:String未被识别为有效的布尔值。   在System.Boolean.Parse(String value)at   System.ComponentModel.BooleanConverter.ConvertFrom(ITypeDescriptorContext   语境,文化信息文化,对象价值)---内心的终结   异常堆栈跟踪--- at   System.ComponentModel.BooleanConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象价值)   System.ComponentModel.TypeConverter.ConvertFrom(Object value)at   System.Windows.Forms.DataGridView.DataGridViewDataConnection.PushValue(的Int32   boundColumnIndex,Int32 columnIndex,Int32 rowIndex,Object value)

以下是相关列属性的屏幕截图,该列包含ThreeState=false,未指定FalseValueTrueValueIndeterminateValue

enter image description here

BindingSource的数据源是List<ErpService.ArrivalChargeAssignment>,其中ArrivalChargeAssignment是我的WCF网络服务中的一个类bool - 字段IsAssigned,所以它可以永远不会是null(甚至是空字符串)。

6 个答案:

答案 0 :(得分:7)

好的,我已经使用Windows窗体设计器进行了一些测试,我在代码生成器中发现了一些奇怪的东西。所以,我在测试中所做的是

首先,我添加了一个DataGridViewCheckBoxColumn类型的列,并使用数据表填充datagridview。我添加了一些空值的记录。

现在,它工作正常,数据显示正确,也没有给出任何错误。 然后,我更改了DefaultCellStyle的{​​{1}}属性,并从CheckedBoxColumn属性中删除了False值,然后重新启动它。 现在,应用程序显示错误。

我回到Nullvalue属性并重新设置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。但是,在修改该属性后,已创建对象,并为该属性分配了字符串类型值。

更新:只需重新创建该列即可解决此问题。

答案 1 :(得分:1)

我一直在努力解决同样的问题并且无需编写任何代码即可进行简单的修复。

问题不在于“TrueValue”或“FalseValue”参数,并且您不需要捕获错误处理程序。简而言之,问题是当DataGridView对象添加一个新行时(因此错误在初始绘制期间触发),但问题的根源是新行中的数据尚未初始化,因此它是“不确定的” “....所以只需为”IndeterminateValue“设置默认值,而不是将其留空。

答案 2 :(得分:0)

使用此可能会使用完整

private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView1["Your Column Index", e.RowIndex].Value = Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value);
        }

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value))
            {
                DataGridView1["Your Column Index", e.RowIndex].Value = false;
            }
            else
            {
                DataGridView1["Your Column Index", e.RowIndex].Value = true ;
            }
        }

答案 3 :(得分:0)

你也可以做一件事。创建网格时,可以指定布尔值“true”或false(如下所示)。在上面的问题中,列索引为0,并且可以在创建网格时访问rowindex。你不会得到错误。我遇到了同样的问题并解决了它,如下所示。同样欣赏其他2个答案。

DataGridViewCell oCell;
oCell = dataGridView["Your Column Index", "Your Row index"];
oCell.Value = false;

答案 4 :(得分:0)

我刚刚以优雅的方式解决了它,如果你的数据库列类型是布尔值(“”)并且你的DataGridView AutoGenerateColumns 为真,那么将生成DataGridViewCheckBoxColumn ,因此您需要做的就是更改默认的true和false值以及数据类型。

解决问题的通用代码,在DataSource分配后插入:

foreach ( DataGridViewColumn dc in DataGridView1.Columns)
{
    if (dc.ValueType == typeof(Boolean))
    {
        dc.ValueType = typeof(Int32);
        ((DataGridViewCheckBoxColumn)dc).DefaultCellStyle.NullValue = 0;
        ((DataGridViewCheckBoxColumn)dc).TrueValue = 1;
        ((DataGridViewCheckBoxColumn)dc).FalseValue = 0;
    }
}

答案 5 :(得分:0)

我尝试了之前的所有答案,但仍然出现可重复的 DataErrors。

我在 DataGridView.DataError 事件中的格式异常错误之前收到“myColumnName Not Found in myDataTable”错误。我通过在重新分配 BindingSource.DataSource 之前的任何时候清除和重置 DataGridView 的 BindingSource 来可靠地解决它(我认为)。例如:

void ReloadMyData()
{
    myBindingSource.DataSource = null;
    myBindingSource.ResetBindings(true);
    DataTable myDataTable = CreateOrReloadMyDataTable();

    // If I do not do the BindingSource clear and reset above,
    //   the following DataSource reassignment throws the DataError exceptions.
    myBindingSource.DataSource = myDataTable.DefaultView;
    myDataGridView.DataSource = myBindingSource;
}

我的开发平台:Visual Studio 2019、16.8.4、C# .NET 4.6.2 WindowsForms、Windows 10 LTSC