c#DataGridview IndexOutOfRangeException(索引X没有值)
我有一个datagridview和一个datatable作为数据源。有时,即使我检查数据是否存在,它也会从DataError事件中给出错误,比如索引X没有值我检查了所有类似的问题,但没有解决我的问题。代码完成后,我将打印收到的DataGridViewDataErrorEventArgs错误对象 任何帮助都会很好。提前谢谢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)
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
}