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)

DataGridView系统.InvalidOperationException单元格不在DataGridView中

如果使用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;
          }
       }
    }
 }