2015-09-05 3 views
0

Я искал несколько таких вопросов, но не смог найти хороший ответ на мою проблему.Индекс за пределами допустимого диапазона в списке

У меня есть 2 списка, один содержит список номеров чеков, а другой содержит список получателей. Код работал нормально, и я сделал некоторые улучшения проверки ошибок, чтобы предотвратить ошибки пользователя, и теперь я получаю это сообщение

Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

В отладке я вижу, что в поле списка получателей есть 41 элемент - это правильно, поэтому, когда выбор меняется в списке проверки в этом случае, я должен выбрать этого конкретного получателя платежа. Это второй в списке получателей, а мой индекс имеет значение 1, и эта ошибка появляется.

Я пробовал свои мозги по этой ошибке в течение последних 2 часов ... вот «оскорбительный» код.

(Внутри обработчика событий) ...

queryReadType.Connection = conn; 
conn.Open(); 
queryReadType.Parameters.Add("@fld1", SqlDbType.VarChar, 50).Value = checkNo; 
SqlDataReader reader = queryReadType.ExecuteReader(); 
try 
{ 
    int i, zid; 
    while (reader.Read()) 
    { 
     int.TryParse(reader["id"].ToString(), out zid); 
     txtCheckNo.Text = reader["checkno"].ToString(); 
     if (option == 60) // Update 
      originalCheckNo = txtCheckNo.Text; 
     int payeeId; 
     int.TryParse(reader["payeeid"].ToString(), out payeeId); 
     txtPayeeId.Text = payeeId.ToString(); 
     string payee = reader["payee"].ToString(); 
     for (i = 0; i < payeecnt; i++) 
     { 
      if (String.Compare(payee, lstPayee.Items[i].ToString()) == 0) 
      { 
       lstPayee.ClearSelected(); 
       //int j = lstPayee.Items.Count; <---- shows 41 
       lstPayee.SetSelected(i, true); <--- the value of i is 1 which //is the correct payee for this check 
        break; 
      } 
     } 
     DateTime dtissued = DateTime.MinValue; 
     //DateTime dtcleared = DateTime.MinValue; 
     colIndex = reader.GetOrdinal("dateissued"); 
     if (!reader.IsDBNull(colIndex)) 
       dtissued = reader.GetDateTime(colIndex); 

.....

Я оценил бы кто-то пролить некоторый свет на то, что может быть неправильно - и он работал отлично - снова этот код внутри изменения элемента выбора для контрольного списка, и, пожалуйста, только положительные комментарии. У меня уже достаточно багажа в рабочий день ... Я заметил, что некоторые участники публикуют комментарии, которые на самом деле не затрагивают проблему, если на это уже был дан ответ, отправьте ссылку.

Заранее спасибо

+1

http://stackoverflow.com/questions/ 20940979/what-is-indexoutofrangeexception-and-how-do-i-fix-it –

+0

PS> Сообщение об ошибке появляется, но правильный «получатель» подсвечивается в списке получателей –

+0

Где вы устанавливаете 'payeecnt'? Попробуйте заменить его на 'lstPayee.Items.Count'. Btw: не следует ли вызывать 'ClearSelected' перед циклом while. В противном случае мы выбираем только последний. –

ответ

0

Моя ставка будет то, что payeecnt не имеет правильное значение. Я не вижу, откуда он получает свою ценность. Тем не менее, в вашем для использования блока значения Items.Count вместо payeecnt, например, так:

for (i = 0; i < lstPayee.Items.Count; i++) 
{ 
    if (String.Compare(payee, lstPayee.Items[i].ToString()) == 0) 
    { 
     lstPayee.ClearSelected(); //int j = lstPayee.Items.Count; <---- shows 41 
     lstPayee.SetSelected(i, true); <--- the value of i is 1 which //is the correct payee for this check 
     break; 
    } 
} 
+0

Я отредактировал код и создал функцию для загрузки моих списков и как-то упустил заполнение внутреннего массива, который я создал, и как-то забыл при консолидации действия. Я попытаюсь ответить на некоторые комментарии –

+0

payeenct установлен в событии формы загрузки, если пользователю нужно «добавить» нового получателя, он/она существует эта форма и добавляет получателя, а затем возвращается, чтобы написать чек новому получателю.Число блоков списка выбранных элементов равно 1 во время разработки, ClearSelected не требуется в моем коде, я добавил его там, пытаясь отладить ошибку. –

+0

В целые числа базы данных хранятся как целые числа, а textPayeeId - скрытый текстовое поле, которое используется кнопками действий, чтобы проверить, правильно ли заполнены данные, прежде чем приступать к обновлению db, поскольку это внешний ключ в таблице проверок. Что касается комментария Оливье. Но можете ли вы объяснить мне, как вы получили значение ordId? В чем причина моего заявления ... –

0

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

Пол

Смежные вопросы