使用复选框列修复数据网格视图中的 FormatException

Posted

技术标签:

【中文标题】使用复选框列修复数据网格视图中的 FormatException【英文标题】:Fixing FormatException in datagrid view with a checkbox column 【发布时间】:2010-12-04 10:07:13 【问题描述】:

我有一个绑定到对象 BindingList 的数据网格控件。对象类的属性之一是布尔值。我已将 datagridview 中的该列自定义为复选框类型。

当 datagridview 为具有从绑定列表中引入的值的行加载时,一切正常。但是,当绘制“新条目”行时,会在复选框单元格上引发 System.FormatException。

确切的错误信息(相关部分):

DataGridView 出现以下异常:

System.FormatException: Value '' cannot be converted to type 'Boolean'. at System.Windows.Forms.Formatter.FormatObjects....

我的搜索表明,当未设置复选框列的真、假和不确定值时,可能会发生这种情况。 URL引用与我类似的问题:

http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/c29427ff-18be-4fb0-a0a7-d1940e1cd817

但是,我已经设置了这些值(如下面的代码所示)。除此之外,我找不到与我的问题相关的任何其他信息。我相当确定问题仅限于复选框的使用,因为当我将列类型更改为简单的文本框时,我没有收到异常错误,只是一列 true / false 显示“新条目”行没有价值。

DataGridView 代码:

// 
        // dataGridView1
        // 
        this.dataGridView1.AllowUserToResizeRows = false;
        dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
        dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
        dataGridViewCellStyle1.NullValue = null;
        dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
        dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
        this.dataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
        this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
        this.dataGridView1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCells;
        this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] 
        this.columnDescription,
        this.columnExpedite,
        this.columnId,
        this.columnQuantity,
        this.columnEntryDate,
        this.columnUpdateDate);
        this.dataGridView1.Location = new System.Drawing.Point(3, 5);
        this.dataGridView1.Name = "dataGridView1";
        this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
        this.dataGridView1.Size = new System.Drawing.Size(1015, 241);
        this.dataGridView1.TabIndex = 0;
        // 
        // columnDescription
        // 
        this.columnDescription.DataPropertyName = "Description";
        this.columnDescription.FillWeight = 200F;
        this.columnDescription.HeaderText = "Description";
        this.columnDescription.Name = "columnDescription";
        // 
        // columnExpedite
        // 
        this.columnExpedite.DataPropertyName = "Expedite";
        this.columnExpedite.FalseValue = "false";
        this.columnExpedite.HeaderText = "Expedited";
        this.columnExpedite.Name = "columnExpedite";
        this.columnExpedite.Resizable = System.Windows.Forms.DataGridViewTriState.True;
        this.columnExpedite.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
        this.columnExpedite.TrueValue = "true";
        this.columnExpedite.IndeterminateValue = "false";
        // 
        // columnId
        // 
        this.columnId.DataPropertyName = "Id";
        this.columnId.HeaderText = "Id";
        this.columnId.Name = "columnId";
        this.columnId.Visible = false;
        // 
        // columnQuantity
        // 
        this.columnQuantity.DataPropertyName = "Quantity";
        this.columnQuantity.HeaderText = "Quantity";
        this.columnQuantity.Name = "columnQuantity";
        // 
        // columnEntryDate
        // 
        this.columnEntryDate.DataPropertyName = "EntryDateTime";
        dataGridViewCellStyle2.Format = "g";
        dataGridViewCellStyle2.NullValue = null;
        this.columnEntryDate.DefaultCellStyle = dataGridViewCellStyle2;
        this.columnEntryDate.HeaderText = "Entry Date/Time";
        this.columnEntryDate.Name = "columnEntryDate";
        this.columnEntryDate.ReadOnly = true;
        this.columnEntryDate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
        this.columnEntryDate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
        // 
        // columnUpdateDate
        // 
        this.columnUpdateDate.DataPropertyName = "UpdateDateTime";
        this.columnUpdateDate.HeaderText = "Last Update Date/Time";
        this.columnUpdateDate.Name = "columnUpdateDate";
        this.columnUpdateDate.ReadOnly = true;
        this.columnUpdateDate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
        this.columnUpdateDate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;

编辑添加: 我尝试过的其他几件事:

尝试使用 DefaultValueNeeded 事件。当我“触摸”新条目行时加载默认值,但在此之前触发了异常,当“新条目”行实际绘制时。

已尝试使用 dataGridView1.Columns["columnExpedite"].DefaultCellStyle.NullValue = "false"; 结果相同。

我该如何解决这个异常?

【问题讨论】:

【参考方案1】:

我可能读错了,但这听起来像是一个操作顺序问题。我没有看到您将项目添加到列表中的代码,所以我不能 100% 确定他,但我猜您正在将新对象添加到列表中,然后修改值

您需要确保布尔值不为空。如果您要添加新项目,。您将需要填充要添加的对象的值您将其添加到他的列表中。确保这一点的一种可能方法是设置默认值 false 或 true,或者在构造函数中设置它。

编辑 - 添加

我自己没有对此进行测试,但我希望它对你有用。

你能挂钩DataGridView的DefaultValuesNeeded事件吗?该事件应该在抛出异常之前触发,这应该可以解决问题......

【讨论】:

这是一个很好的观点。我应该解决这个问题,我的绑定语句发生在表单加载时。此外,我的构造函数实际上确实为布尔成员设置了默认值。当我点击“新条目”行时,默认值被拉入(我还设置了默认日期)。将“新条目”行绘制到屏幕上时会出现问题。 我尝试了那个事件,并设置了一个值......它确实填充了,但直到我点击新条目......当新条目行绘制时触发异常。绘图在该单元格上暂停。【参考方案2】:

是的。 试试这个代码:

private void dataGridViewEpizode_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
    
        try
        
            e.Row.Cells[22].Value = false;
        
        catch (Exception ex)
        
            mainForm.staticvar.logger.Write(ex);
        
    

【讨论】:

以上是关于使用复选框列修复数据网格视图中的 FormatException的主要内容,如果未能解决你的问题,请参考以下文章

将列表绑定到包含复选框列的数据网格视图

从视图模型中选择数据网格行中的所有复选框

为啥滚动网格中的 jqxgrid 未选中复选框或单选按钮列?

带有复选框列的 Ext JS 网格面板

如何创建一个道场数据网格,其中一列是标题行中的按钮?

PHPMyAdmin 4.0.5 - 网格编辑,复选框,编辑,复制和删除功能不可用