我有一个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;
答案 0 :(得分:18)
我想click事件会尝试获取当前选中的行并对其执行某些操作,而dataGridViewExample.DataSource = null;
清除数据源,并且当前选定的行变为空。
如果将DataGridView.DataSource
设置为列表,则无需将其重置为空,刷新并再次将其重置为列表(并再次刷新)以查看更改。只需刷新DataGridView
即可。
您也可以尝试使用BindingList<T>
对象而不是List<T>
,它会自动通知您的网格内部更改(添加和删除元素),还有{{1}您可以在INotifyPropertyChanged
类上实现的接口,它将使对象中的每个属性更改显示在网格上(对于代码中对象所做的任何更改,而不是通过网格本身)。
答案 1 :(得分:0)
您是否尝试运行调试器并在抛出InedxOutOfRangeException时中断以查看抛出异常的位置?
选择调试&gt;例外情况下,对话框上有一个“查找”按钮,因此您无需浏览所有可能性。
答案 2 :(得分:0)
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();
}