DataGridView系统.InvalidOperationException单元格不在DataGridView中
本文关键字:DataGridView 单元格 系统 InvalidOperationException | 更新日期: 2023-09-27 18:04:29
一段时间以来,我第一次在谷歌上找到关于这个异常的有用信息…希望别人也能看到。
我有一个DataGridView,我在Leave事件上验证空单元格并删除这些行。
如果我在最后一行中留下最后一个单元格为空并且标签远离DGV,则抛出以下异常:
系统。InvalidOperationException: Cell不在DataGridView中。的单元格无法检索继承的单元格样式。
我没有使用数据绑定,如果我在this.dataGridView1.Rows.RemoveAt(c.RowIndex);
放置一个断点,它被击中,如果我进入这一行,在执行非用户代码期间抛出异常…
我原以为这与未提交的更改有关,但似乎明确提交更改并不影响结果。
我的Leave
事件代码:
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;
}
}
}
}
}
异常数据在这里:
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-loop,则不能从它使用的集合中删除项。这里您正在从this.dataGridView1.Rows中删除项。
试试这个:
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;
}
}
}
}