关于c#:DataGridView System.InvalidOperationException单元格不在DataGridView中

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.

我没有使用数据绑定,如果我在this.dataGridView1.Rows.RemoveAt(c.RowIndex);处放置一个断点,它会被命中,如果我进入这一行,在执行非用户代码时会抛出异常…

我原以为这与未提交的更改有关,但显式提交更改似乎不会影响结果。

我的Leave事件代码:

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;
          }

       }
    }
 }