我有一个datagridview,我们将其称为dataGridViewExample。
我的对象(不常见的数据类型是因为我的数据库是SQLite):
class MyObject
{
public Int64 Vnr { get; set; }
public string Name { get; set; }
public Single Price { get; set; }
public int Amount { get; set; }
}
以下是相关代码:
//This form gets called with a .ShowDialog(); in my form1.
private List<MyObjecte> ExampleList = new List<MyObject>();
public MyForm()
{
dataGridViewExample.DataSource = OrdreInkøbsListe;
}
private void AddtoDataGridViewExample()
{
//Add a new MyObject to the list
ExampleList.Add(new myObject()
{
Vnr = newVnr,
Amount = newAmount,
Price = newPrice,
Name = newName
});
//refresh datasource
dataGridViewExample.DataSource = null;
dataGridViewExample.Refresh();
dataGridViewExample.DataSource = OrdreInkøbsListe;
ddataGridViewExample.Refresh();
}
当使用.ShowDialog调用MyForm时,它显示得很好,并且很好地显示了我的DataGridView示例。从代码中可以看到,
ExampleList
最初是空的,因此只显示了一个空的datagridview,其中有4列:Vnr,名称,价格和金额。如果我在其中单击等,则什么也没发生-到目前为止,一切都按计划进行。每次我调用
AddtoDataGridViewExample()
时,它都会将新对象添加到Datagridview中,并且datagridview确实会更新,列出到目前为止添加的所有对象(根据计划再次将它们显示为行)。现在,请记住,我刚刚说过,如果您在调用
DataGridViewExample
之前在AddtoDataGridViewExample()
中单击,则什么都没有发生?好吧,在一次或多次调用
AddtoDataGridViewExample()
之后,如果我在DataGridViewExample
中单击,该程序将崩溃(例如:用户要选择一行)。它抛出 IndexOutOfRangeException 并讨论-1索引。在我用
.ShowDialog()
调用MyForm的那一行,它还会引发另一种形式的异常;我真的很坚持这一点,你们有什么主意吗?
我唯一的线索是,我相信
DataGridViewExample
数据源的刷新可能是问题的原因。另一个重要注意:我尚未将任何事件绑定(bind)到
DataGridViewExample
。因此,您可以排除该想法。这是
DataGridViewExample
的所有属性:this.dataGridViewExample.AllowUserToAddRows = false;
this.dataGridViewExample.AllowUserToDeleteRows = false;
this.dataGridViewExample.AllowUserToResizeColumns = false;
this.dataGridViewExample.AllowUserToResizeRows = false;
this.dataGridViewExample.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridViewExample.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridViewExample.Location = new System.Drawing.Point(591, 53);
this.dataGridViewExample.MultiSelect = false;
this.dataGridViewExample.Name = "dataGridViewExample";
this.dataGridViewExample.ReadOnly = true;
this.dataGridViewExample.RowHeadersVisible = false;
this.dataGridViewExample.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridViewExample.ShowEditingIcon = false;
this.dataGridViewExample.Size = new System.Drawing.Size(240, 150);
this.dataGridViewExample.TabIndex = 31;
最佳答案
我猜想click事件会尝试获取当前选中的行并对其进行处理,而dataGridViewExample.DataSource = null;
会清除数据源,而当前选中的行将变为null。
如果将DataGridView.DataSource
设置为列表,则无需将其重置为null,刷新并再次将其重置为列表(然后再次刷新)以查看更改。刷新DataGridView
就足够了。
您也可以尝试使用BindingList<T>
对象而不是List<T>
,它会自动将其内部更改(添加和删除元素)通知您的网格,并且您还可以在INotifyPropertyChanged
类上实现MyObject
接口(interface),该接口(interface)将使每个属性更改显示在网格上的对象(对于代码中对该对象所做的任何更改,而不是通过网格本身进行的更改)。
关于c# - 单击时导致IndexOutOfRangeException的Datagridview,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/930069/