Индекс 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++;
}
6 ответов:
Вы получаете индекс строки и затем пытаетесь использовать его с
rowsDisplayStatus. Вы не можете использовать индекс строк базы данных в качестве индекса для своих коллекций.Я бы изменил:
if (!rowsDisplayStatus[rowIndex])Кому:
if (!rowsDisplayStatus[i])
Как заполняется rowsDisplayStatus? Если он содержит только один элемент и что-то должно быть в индексе 9, вы должны взглянуть на код, который заполняет его.
Как показано на рисунке, rowsDisplayStatus содержит 1 элемент... вы пытаетесь вытащить 10-й пункт (или пункт в индексе 9)... этот индекс находится вне диапазона.
Я объясню, что сказал Марк выше. (Не знаю, как комментировать, поэтому добавляю это в ответ) Он прав, вы должны изменить
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