Datagridview在单击时导致IndexOutOfRangeException

时间:2009-05-30 16:35:59

标签: c# winforms datagridview

我有一个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最初是空的,因此它只显示一个包含4列的空数据网格视图:Vnr,Name,Price&amp;量。如果我点击其中等等没有任何反应 - 所以到目前为止一切都按计划进行。

每当我调用AddtoDataGridViewExample()时,它会将新对象添加到Datagridview,并且datagridview会更新,列出到目前为止添加的所有对象(它们再次根据计划显示为行)。

现在,请记住,我刚刚说过,如果您在调用DataGridViewExample之前点击AddtoDataGridViewExample()内部没有任何结果? 好吧,在调用AddtoDataGridViewExample()一次或多次之后,如果我在DataGridViewExample内单击,程序将崩溃(例如:用户想要选择一行)。它抛出 IndexOutOfRangeException 并讨论-1索引。 它还以另一种形式抛出异常,在我用.ShowDialog()调用MyForm的行上;

我真的很困惑,你们有什么问题吗? 我的唯一线索是,我确实认为DataGridViewExample数据源的刷新可能是导致问题的原因。 另一个重要注意:我已将任何事件绑定到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;

3 个答案:

答案 0 :(得分:18)

我想click事件会尝试获取当前选中的行并对其执行某些操作,而dataGridViewExample.DataSource = null;清除数据源,并且当前选定的行变为空。

如果将DataGridView.DataSource设置为列表,则无需将其重置为空,刷新并再次将其重置为列表(并再次刷新)以查看更改。只需刷新DataGridView即可。

您也可以尝试使用BindingList<T>对象而不是List<T>,它会自动通知您的网格内部更改(添加和删除元素),还有{{1}您可以在INotifyPropertyChanged类上实现的接口,它将使对象中的每个属性更改显示在网格上(对于代码中对象所做的任何更改,而不是通过网格本身)。

答案 1 :(得分:0)

您是否尝试运行调试器并在抛出InedxOutOfRangeException时中断以查看抛出异常的位置?

选择调试&gt;例外情况下,对话框上有一个“查找”按钮,因此您无需浏览所有可能性。

答案 2 :(得分:0)

我有类似的情况。我将某些对象的通用列表分配给DataGridView。然后我将Data设置为null并在刷新之后。之后,我将对象列表分配给DataSource。点击网格时,运行时错误发生IndexOutOfRange。我的解决方案是将我的对象的新空列表分配给该网格并刷新,在我的工作列表上进行更改后,我将分配给DataSource并调用Refresh。现在,它正在运行,没有任何崩溃。请在查看之前查看我的代码:

grid.DataSource = null;
grid.Refresh();
if(cases.Count() > 0)
{
   grid.DataSource = cases;
   grid.Refresh();
}            

现在在我的代码之后:

grid.DataSource = new List<MyCase>();
grid.Refresh();
//do something with cases
if(cases.Count() > 0)
{
   grid.DataSource = cases;
   grid.Refresh();
}