2014-08-14 4 views
0

Я получаю индексную ошибку в инструкции my else if, но я не могу найти причину этого.Индекс находился за пределами массива в CheckedListBox

То, что я делаю, проходит через CheckedListBox, если значения не отмечены, распечатать ошибку еще раз показать выбранные значения в MessageBox.

Может кто-нибудь мне помочь? Спасибо!

for (int i = 0; i < checkedListBox1.Items.Count; i++) 
if (checkedListBox1.CheckedItems.Count == 0) 
{ 
    Empty.SetError(checkedListBox1, "Please select at Least One"); 
    return; 
} 
else if (checkedListBox1.GetItemChecked(i)) 
{ 
    MessageBox.Show(checkedListBox1.CheckedItems[i].ToString()); 
} 

ответ

1

Перемещение Count -ckeck перед циклом:

if (checkedListBox1.CheckedItems.Count == 0) 
{ 
    Empty.SetError(checkedListBox1, "Please select at Least One"); 
    return; 
} 

Но важной частью является то, что вы зацикливание все элементы. Затем вы проверяете каждый элемент, если он установлен с GetItemChecked. Это нормально, но тогда вы используете checkedListBox1.CheckedItems[i], который не содержит всего позиций, но только проверено элементов. Вот почему вы получаете Индекс был за пределами границ Ошибка.

Вместо этого вам просто нужно использовать эту коллекцию вместо зацикливания всего:

for(int i = 0; i < checkedListBox1.CheckedItems.Count; i++) 
{ 
    MessageBox.Show(checkedListBox1.CheckedItems[i].ToString()); 
} 
1

Вы должны изменить

i < checkedListBox1.Items.Count; 

To:

i < checkedListBox1.CheckedItems.Count; 
+0

Это не достаточно 'checkedListBox1.GetItemChecked (я)' даст неправильные результаты тогда. -1 –

0

Почему вы проверяя CheckedItems.Count внутри для цикла?

Возьмите первую часть предложения If вне цикла For.

В конце ваш код может выглядеть так:

if (checkedListBox1.CheckedItems.Count == 0) 
{ 
    Empty.SetError(checkedListBox1, "Please select at Least One"); 
} 
for (int i = 0; i < checkedListBox1.Items.Count; i++) 
    if (checkedListBox1.GetItemChecked(i)) 
    { 
    MessageBox.Show(checkedListBox1.Items[i].ToString()); 
    } 
+0

Предотвращает ли это исключение? –

+0

Это позволит второй части if работать правильно. Он проверяет каждый элемент «i» из checkedListBox. –

+0

Также нет смысла использовать CheckedItems [i], если элемент «i» отмечен в списке. Вы можете взять его с checkedListBox1.Items [i] .ToString(); –

1

checkedListBox1.CheckedItems[i] проблема. Вы просматриваете все элементы, но индексируете CheckedItems. Поэтому, когда у вас есть 10 предметов и проверено 2-й элемент и 8-й элемент, CheckedItems будет иметь только два элемента, но вы получите доступ к CheckedItems[7], поэтому вы получаете исключение.

Используйте коллекцию CheckedItems, чтобы получить доступ к проверенным предметам напрямую.

if (checkedListBox1.CheckedItems.Count == 0) 
{ 
    Empty.SetError(checkedListBox1, "Please select at Least One"); 
    return; 
} 
foreach (var checkedItem in checkedListBox1.CheckedItems) 
{ 
    MessageBox.Show(checkedItem.ToString()); 
} 
Смежные вопросы