Datagridview вызывает исключение IndexOutOfRangeException при нажатии
у меня есть 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();
}
когда MyForm вызывается с a .ShowDialog, он показывает отлично и отображает мой пример DataGridView просто отлично. Как вы можете прочитать из кода ExampleList
изначально пуст, поэтому он просто показывает пустой datagridview с 4 столбцами: Vnr, Name, Price & Сумма. Если я нажму внутри него и т. д. ничего не происходит - значит, пока все идет по плану.
каждый раз, когда я называю AddtoDataGridViewExample()
Он добавляет новый объект в Datagridview, и datagridview обновляет, перечисляя все объекты, добавленные до сих пор (они показывают себя как строки, снова в соответствии с планом).
теперь, помните, что я только что сказал, что ничего не произошло, если вы нажали внутри DataGridViewExample
прежде чем я назвал AddtoDataGridViewExample()
?
Ну, после того, как позвонили AddtoDataGridViewExample()
один или более программа рухнет, если я нажму внутри DataGridViewExample
(например: пользователи хотят выбрать строку). Он бросает IndexOutOfRangeException и говорит об индексе -1.
Он также выдает исключение в другой форме, в строке, где я вызываю MyForm с .ShowDialog()
;
Я действительно застрял на этом, вы, ребята, знаете, что не так??
моя единственная зацепка - что я верю обновлению 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 ответов
Я думаю, событие click пытается получить выбранную строку и что-то с ней сделать, в то время как dataGridViewExample.DataSource = null;
очищает источник данных, и текущая выбранная строка становится null.
если вы выберите DataGridView.DataSource
для списка вам не нужно сбрасывать его в null, обновлять и снова сбрасывать его в список (и снова обновлять), чтобы увидеть изменения. Этого будет достаточно, чтобы просто обновить DataGridView
.
вы также можете просто попробовать использовать BindingList<T>
вместо List<T>
, который автоматически уведомлять сетку о ее внутренних изменениях (добавление и удаление элементов), а также INotifyPropertyChanged
интерфейс, который вы можете реализовать на своем MyObject
class, который будет делать каждое изменение свойства в объекте показать на сетке (для любых изменений, внесенных в объект в коде, а не через саму сетку).
вы пробовали запустить отладчик и сломать, когда inedxoutofrangeexception создается, чтобы увидеть, где создается исключение?
выберите отладка > исключения, то есть найти кнопку в диалоговом окне, так что вам не придется просматривать все возможности.
у меня была похожая ситуация. Я назначил общий список определенного объекта DataGridView. Затем я устанавливал null в DataSource и после этого обновления. После этого я назначаю список объектов 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();
}