Индекс C # находился за пределами массива - PullRequest
2 голосов
/ 05 августа 2009

Я надеюсь, что кто-то может помочь с исключением, которое я унаследовал. В основном я записываю строки в сетке данных в текстовый файл. Это прекрасно работает, кроме случаев, когда строка скрыта, когда строка скрыта, исключение «Индекс был вне границ массива» выбрасывается в строку, выделенную ниже. Спасибо за любую помощь.

DataRow dr;

for (int i = 0; i < bindingManagerBase.Count; i++)

{bindingManagerBase.Position = i;

    dr = ((DataRowView)bindingManagerBase.Current).Row;

    bindingManagerBase.SuspendBinding();
    try
    {

        int rowIndex = dr.Table.Rows.IndexOf(dr);

        if (!rowsDisplayStatus[rowIndex])  //<---------Exception here "Index was outside the bounds of the array" //Picture below
        {
            m_Dgv.Rows[rowIndex].Visible = false;
            continue;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString()); 
    }
    finally
    {
        bindingManagerBase.ResumeBinding();
    }
    writeData(tw, dr);
    iIndex++;
}

alt text

Ответы [ 6 ]

2 голосов
/ 05 августа 2009

Вы получаете индекс строки и затем пытаетесь использовать его с rowsDisplayStatus. Вы не можете использовать индекс строки базы данных в качестве индекса ваших коллекций.

Я бы изменил:

if (!rowsDisplayStatus[rowIndex]) 

до:

if (!rowsDisplayStatus[i]) 
1 голос
/ 05 августа 2009

Как заполняется rowDisplayStatus? Если он содержит только один элемент и ожидается, что что-то будет с индексом 9, вам следует взглянуть на код, который его заполняет.

0 голосов
/ 07 августа 2009

По сути, всякий раз, когда я получал эту ошибку, индекс (или значение, которое я установил) не существовал на момент обращения к нему.

Например, если у меня есть два элемента в ListBox и я пытаюсь сослаться на третий элемент, я получу исключение индекса вне диапазона (много раз в прошлом) ...

0 голосов
/ 05 августа 2009

Я объясню, что сказал выше. (Не знаю, как комментировать, поэтому поставлю это в ответ) Он прав, вы должны изменить

if (!rowsDisplayStatus[rowIndex])

В

if (!rowsDisplayStatus[i])

Причина этого заключается в следующем:

rowIndex увеличивается, даже если строки ранее были удалены из объекта Rows. Таким образом, в dr.Table.Rows может быть только одна или две строки, но они могут иметь индексы (индексы), например, 8 и 9 (потому что ранее строки с 1 по 7 были стерты или по другим причинам).

Таким образом, вы получите текущий rowIndex, проверив свойство bindingManager.Current.RowIndex.

Но ваш rowDisplayStatus - это простой массив (или ArrayList) с правильным количеством строк в соответствии с i. Таким образом, для индекса строки: 8 (первая строка) вы должны смотреть на rowDisplayStatus [0] (который является значением i), а для индекса строки: 9 (вторая строка) вы должны смотреть на rowDisplayStatus [1] ... и т.д.

HTH, Моше

0 голосов
/ 05 августа 2009

Как заполняется " rowDisplayStatus "? Возможно, в этой процедуре есть проблема.

0 голосов
/ 05 августа 2009

Как показано на рисунке, в rowDisplayStatus есть 1 элемент ... вы пытаетесь извлечь 10-й элемент (или элемент с индексом 9) ... этот индекс выходит за пределы диапазона.

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