我有一个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/

10-10 03:34