InvalidArgument= Значение ‘6’ недопустимо для индекса. Имя параметра: индекс

#c# #winforms #listview

#c# #winforms #listview

Вопрос:

Я создал элемент управления Listview с 8 столбцами. Когда мне нужно извлечь текст из подпункта элемента, я использую следующий код:

 foreach (ListViewItem item in listViewStatus.Items)
            {
                if (item.Tag == f)
                {
                    /* Use locking to synchronise across mutilple thread calls. */
                    lock (_lockObject)
                    {
                        item.SubItems[6].Text = Status;
                    }
                    break;
                }
            }
  

отображается исключение. Но когда я заменяю элемент.Подпункты [6] .Текст с элементом.Подпункты [5] .Текст работает. Как я могу это исправить?

Комментарии:

1. Проверьте, сколько раз это элемент. У подпунктов есть? возможно, элемент. Подпункты. Count()?

2. Он показывает 6. Но у меня есть столбец 8

3. Ох. Когда я создаю подпункт, я создаю только 6. : D

4. Вы заполнили все столбцы подпунктом через ListView. SubItems.Add() ?

5. Я не уверен в вашей проблеме, но если это WPF или Winforms (что, похоже, так и есть), в первую очередь не должно быть нескольких потоков, обращающихся к вашему listview. Основной принцип WPF и Winforms заключается в том, что только поток-создатель должен получать доступ к элементам управления. Скорее всего, это также связано с вашей проблемой.

Ответ №1:

Очевидно, что у вас не более 6 столбцов в подпунктах

Ответ №2:

Если вы создали только 6, то значения равны 0-5; это означает, что 6 недопустимо.

Ответ №3:

Это классический сценарий ошибки «по отдельности».

Индексы бывают двух видов: на основе нуля и на основе единицы. C # — это язык индексов с нулевым индексом. Я предполагаю, что вы либо впервые изучаете язык, либо впервые изучаете язык с нулевым значением — в противном случае я упускаю суть вопроса, и я прошу прощения. 🙂

Смотрите Википедию, ошибка по одному: http://en.wikipedia.org/wiki/Off-by-one_error

Исключение ArgumentOutOfRange выдается средой выполнения, когда она понимает, что в списке нет 7-го элемента. Такого рода ошибки не могут быть обнаружены во время компиляции (без использования эвристики) из-за того, что список может содержать любое количество значений в любое время

TLRD;

На основе нуля (C #):

 ... = myList[0]; // This is a zero-based indexer.
... = myList[1];
... = myList[2];
... = myList[3];
... = myList[4];
... = myList[5]; // This is the 6th item, although the index is 5.
  

На основе одного (какой-либо другой язык):

 ... = myList[1]; // This is a one-based indexer.
... = myList[2];
... = myList[3];
... = myList[4];
... = myList[5];
... = myList[6]; // This is the 6th item, and the index is 6.
  

Ответ №4:

 SubItems[6]
  

6 там представлен индекс столбца, а не индекс строки.