#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
там представлен индекс столбца, а не индекс строки.