【问题标题】:DataGridView System.InvalidOperationException Cell is not in a DataGridViewDataGridView System.InvalidOperationException 单元格不在 DataGridView 中
【发布时间】:2014-05-22 05:57:02
【问题描述】:

一段时间以来,我第一次在 Google 上找不到有关此异常的使用信息...希望其他人可能已经遇到过。

我有一个 DataGridView,我在 Leave 事件中验证空单元格并删除这些行。

如果我将最后一行中的最后一个单元格留空并且制表符远离 DGV,则会引发以下异常:

System.InvalidOperationException:单元格不在 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)

【问题讨论】:

  • 属性 AllowUserToAddRows 设置的值是多少?

标签: c# .net winforms datagridview


【解决方案1】:

如果您使用的是 foreach 循环,则无法从它使用的集合中删除项目。在这里,您要从 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;
          }

       }
    }
 }

【讨论】:

  • 就是这样!非常感谢!既然你这么说,那就太明显了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2010-10-30
  • 1970-01-01
  • 2012-09-09
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多