Datagridview вызывает IndexOutOfRangeException при нажатии - PullRequest
8 голосов
/ 30 мая 2009

У меня есть сетевое представление, которое мы будем называть 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 вызывается с .ShowDialog, он отображается нормально и показывает мой пример DataGridView очень хорошо. Как вы можете прочитать из кода, ExampleList изначально пуст, поэтому он просто показывает пустое представление данных с 4 столбцами: Vnr, Name, Price & Amount. Если я щелкну внутри него и т. Д., Ничего не произойдет, поэтому пока все работает, как запланировано.

Каждый раз, когда я вызываю 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 ]

18 голосов
/ 30 мая 2009

Я предполагаю, что событие click пытается получить текущую выбранную строку и что-то с ней сделать, в то время как dataGridViewExample.DataSource = null; очищает источник данных, и текущая выбранная строка становится нулевой.

Если вы установите DataGridView.DataSource в список, вам не нужно сбрасывать его в null, обновлять и снова сбрасывать в список (и обновлять снова), чтобы увидеть изменения. Достаточно будет просто обновить DataGridView.

Вы также можете просто попробовать использовать объект BindingList<T> вместо List<T>, который автоматически уведомит вашу сетку о ее внутренних изменениях (добавление и удаление элементов), а также есть интерфейс INotifyPropertyChanged, который можно реализовать на ваш класс MyObject, который будет вносить каждое изменение свойства в объект, отображаемый в сетке (для любых изменений, внесенных в объект в коде, а не в самой сетке).

0 голосов
/ 01 апреля 2015

У меня была похожая ситуация. Я назначил общий список определенного объекта для DataGridView. Затем я установил нулевое значение для 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();
}            
0 голосов
/ 30 мая 2009

Пытались ли вы запустить отладчик и прервать работу при возникновении исключения InedxOutOfRangeException, чтобы увидеть, куда выдается исключение?

Выберите «Отладка»> «Исключения», в диалоговом окне есть кнопка «Найти», чтобы вам не приходилось просматривать все возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...