Индекс C# находился за пределами массива



Я надеюсь, что кто-нибудь сможет помочь с исключением, которое я унаследовал. В основном я записываю строки в datagrid в текстовый файл. Который отлично работает, кроме того, когда строка скрыта, когда строка скрыта исключение "индекс был за пределами массива" бросается на строку, выделенную ниже. Спасибо за любую помощь.



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 текст http://i28.tinypic.com/14e84mg.png

769   6  

6 ответов:

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

Я бы изменил:

if (!rowsDisplayStatus[rowIndex]) 

Кому:

if (!rowsDisplayStatus[i]) 

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

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

Как заполняется " rowsDisplayStatus "? Может быть, в этой рутине есть какая-то проблема.

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

if (!rowsDisplayStatus[rowIndex])

В

if (!rowsDisplayStatus[i])

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

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

Таким образом, вы получаете текущий rowIndex, проверяя bindingManager.Текущий.Параметр rowindex собственность.

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

ХТ, Моше

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

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

Comments

    Ничего не найдено.