DataGridView System.InvalidOperationException Cell is not in a DataGridView
有段时间以来,我第一次在谷歌上发现关于这个例外的无用信息…希望有人能遇到。
我有一个DataGridView,可以在Leave事件中验证空单元格并删除这些行。
如果最后一行中的最后一个单元格为空,并且选项卡远离DGV,则会引发以下异常:
System.InvalidOperationException: Cell is not in a DataGridView. The
cell cannot retrieve the inherited cell style.
我没有使用数据绑定,如果我在
我原以为这与未提交的更改有关,但显式提交更改似乎不会影响结果。
我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | private void dataGridView1_Leave(object sender, EventArgs e) { if (this.dataGridView1.IsCurrentRowDirty || this.dataGridView1.IsCurrentCellDirty) this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); //Validate for empty rows foreach(DataGridViewRow row in this.dataGridView1.Rows) { foreach(DataGridViewCell c in row.Cells) { if(c.Value == null || c.Value.ToString() == String.Empty) { if (c.EditedFormattedValue == null || c.EditedFormattedValue.ToString() =="") { this.dataGridView1.Rows.RemoveAt(c.RowIndex); break; } } } } } |
异常数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | System.InvalidOperationException: Cell is not in a DataGridView. The cell cannot retrieve the inherited cell style. at System.Windows.Forms.DataGridViewCell.GetInheritedStyle(DataGridViewCellStyle inheritedCellStyle, Int32 rowIndex, Boolean includeColors) at System.Windows.Forms.DataGridView.OnCellValidating(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, DataGridViewDataErrorContexts context) at System.Windows.Forms.DataGridView.CommitEdit(DataGridViewCell& dataGridViewCurrentCell, DataGridViewDataErrorContexts context, DataGridViewValidateCellInternal validateCell, Boolean fireCellLeave, Boolean fireCellEnter, Boolean fireRowLeave, Boolean fireRowEnter, Boolean fireLeave) at System.Windows.Forms.DataGridView.EndEdit(DataGridViewDataErrorContexts context, DataGridViewValidateCellInternal validateCell, Boolean fireCellLeave, Boolean fireCellEnter, Boolean fireRowLeave, Boolean fireRowEnter, Boolean fireLeave, Boolean keepFocus, Boolean resetCurrentCell, Boolean resetAnchorCell) at System.Windows.Forms.DataGridView.ProcessDialogKey(Keys keyData) at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData) at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) at System.Windows.Forms.Control.PreProcessMessage(Message& msg) at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) |
如果正在使用foreach循环,则无法从它使用的集合中移除项。在这里,您将从this.DataGridView1.Rows中删除项。
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | for (int i = 0; i < dataGridView1.Rows.Count; i++) { DataGridViewRow row = dataGridView1.Rows[i]; for (int k = 0; k < row.Cells.Count; k++) { DataGridViewCell c = row.Cells[k]; if (c.Value == null || c.Value.ToString() == String.Empty) { if (c.EditedFormattedValue == null || c.EditedFormattedValue.ToString() =="") { this.dataGridView1.Rows.RemoveAt(c.RowIndex); // Decrease i, as the collection got smaller i--; break; } } } } |