【发布时间】:2009-05-30 16:35:59
【问题描述】:
我有一个 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 会更新,列出到目前为止添加的所有对象(它们显示为行,再次根据计划)。
现在,还记得我刚才说过,如果你在我打电话给AddtoDataGridViewExample() 之前点击了DataGridViewExample,什么都不会发生?
好吧,在调用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;
【问题讨论】:
-
处理点击事件的代码在哪里?通常会发生此异常,因为您正在处理单击事件,然后在没有选择行时尝试获取所选行。选择一行并单击网格是互斥的。那么,处理引发异常的点击事件的代码在哪里呢?
-
我还没有向 dataGridViewExample 添加任何事件,这是令人担忧的部分 :( 所以如果有的话,它是导致它的一些内置事件。
标签: c# winforms datagridview