c#DataGridview IndexOutOfRangeException(索引X没有值)

c#DataGridview IndexOutOfRangeException(索引X没有值),c#,data-binding,datagridview,datagrid,datatable,C#,Data Binding,Datagridview,Datagrid,Datatable,我有一个datagridview和一个datatable作为数据源。有时,即使我检查数据是否存在,它也会从DataError事件中给出错误,比如索引X没有值我检查了所有类似的问题,但没有解决我的问题。代码完成后,我将打印收到的DataGridViewDataErrorEventArgs错误对象 任何帮助都会很好。提前谢谢 DataTable dt = new DataTable(); Form1_load() { dt.Columns.Add("id", typeof(long)

我有一个datagridview和一个datatable作为数据源。有时,即使我检查数据是否存在,它也会从DataError事件中给出错误,比如索引X没有值我检查了所有类似的问题,但没有解决我的问题。代码完成后,我将打印收到的DataGridViewDataErrorEventArgs错误对象

任何帮助都会很好。提前谢谢

DataTable dt = new DataTable();
Form1_load()
{
        dt.Columns.Add("id", typeof(long));
        dt.Columns.Add("field1", typeof(string));
        dt.Columns.Add("field2", typeof(string));
        dt.Columns.Add("field3", typeof(string));
        dt.Columns.Add("field4", typeof(string));
        dt.Columns.Add("field5", typeof(string));

        dt.PrimaryKey = new[] { AliveTable.Columns["id"] };

        dataGridView1.DataSource = dt;
        dataGridView1.DataError += DataGridView_DataError;

}

public void ListData()
{
   foreach(var item in data)
  {
      if(item.delete)
      { 
        var row = dt.Rows.Find(item.id); 
        if(row != null) { row.Delete();}
        continue;
      }

      InserOrUpdateData(item.id);
   }

}

  public void InserOrUpdateData(long id)
  {
     var data = dataFromDb;

        bool exist = dt.AsEnumerable().Any(row => id == row.Field<long>("id"));

        var item1 = data ["field1"] != null ? data ["field1"] : String.Empty;
        var item2 = data ["field2"] != null ? data ["field2"] : String.Empty;
        var item3 = data ["field3"] != null ? data ["field3"] : String.Empty;
        var item4 = data ["field4"] != null ? data ["field4"] : String.Empty;
        var item5 = data ["field5"] != null ? data ["field5"] : String.Empty;

        if (exist)
        {
            dt.Rows.Find(id)["field1"] = item1;
            dt.Rows.Find(id)["field2"] = item2;
            dt.Rows.Find(id)["field3"] = item3;
            dt.Rows.Find(id)["field4"] = item4;
            dt.Rows.Find(id)["field5"] = item5;

        }
        else
        {
            dt.Rows.Add(id, item1, item2, item3, item4, item5);

        }

  }
   private void DataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        MessageBox.Show(e.Exception.Message.ToString());
    }

“ColumnIndex”:-1,:这是无效的。。例外点我猜不总是-1,有时是5,有时是3。正如我所说,它会改变。当错误发生时,你的价值观是什么?听起来这是由于在数据绑定后从数据绑定集合中删除行造成的。这方面有一些已知的问题。尝试只修改源数据(本例中为datatable),然后重新数据绑定
{
 "Context": 2,
 "Exception": {
 "ClassName": "System.IndexOutOfRangeException",
 "Message": "Index 3 does not have a value.",
 "Data": null,
 "InnerException": null,
 "HelpURL": null,
 "StackTraceString": "   at        System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex)",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": "8\nGetError\nSystem.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.DataGridView+DataGridViewDataConnection\nSystem.String GetError(Int32)",
"HResult": -2146233080,
"Source": "System.Windows.Forms",
"WatsonBuckets": null
 },
"ThrowException": false,
"ColumnIndex": 5,
"RowIndex": 3,
"Cancel": false
 }