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();
}