Ошибка отображения просмотра списка со строками списка в C#
У меня есть listView1 в C# WinForms, который отображает 2 списка
List<string> pths;
List<string> rec;
public void Disp ()
{
DisplayListInColumns(listView1, pths, 0);
DisplayListInColumns(listView1, rec, 1);
}
private static void DisplayListInColumns(ListView listView, List<string> values, int columnIndex)
{
for (int index = 0; index < values.Count; index++)
{
while (index >= listView.Items.Count)
{
listView.Items.Add(new ListViewItem());
}
ListViewItem listViewItem = listView.Items[index];
while (listViewItem.SubItems.Count <= columnIndex)
{
listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem());
}
listViewItem.SubItems[columnIndex].Text = values[index];
}
}
Я использую глобальный список для внесения изменений, а также отображаю его в listview1, но только после того, как пользователь нажмет на apply_button, изменения будут сохранены (в формате xml).
Кнопка "Изменить и добавить детали" работает нормально и отображается отлично. Но когда я удаляю данные, мне выдается ошибка.
Ниже приведено действие удаления:
//Configuration - DELETE button
private void button6_Click(object sender, EventArgs e)
{
string select = null;
if (listView1.SelectedItems.Count > 0)
{
select = (listView1.SelectedItems[0].Text);
}
int count = listView1.SelectedItems[0].Index;
if (select != null)
{
pths.RemoveAt(count);
rec.RemoveAt(count);
string s = String.Join("; ", pths.ToArray());
string r = String.Join("; ", rec.ToArray());
//MessageBox.Show(s);
//MessageBox.Show(r);
}
Disp();
}
Я думаю, что после нескольких попыток я ошибаюсь с индексом. Даже после удаления во время отладки я получаю listView.Items.Count = 5.
Я предполагаю, что число все еще 5 (образец - 5 строк в списке), когда после удаления оно должно уменьшиться до 4 и индекс 0-3 соответственно. Я получаю следующий эрор
ArgumentOutOfRangeException at pths.RemoveAt(count)
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
В качестве альтернативы я пытался pths.Remove(select);
но не решил это.
Любая помощь будет оценена. Спасибо
3 ответа
Похоже, вам просто нужно перезагрузить список...
//Clear it
listView1.Items.Clear();
//reload it.
listView1.Refresh();
Измените свое заявление if
if (select != null)
к этому
if(!string.IsNullOrWhiteSpace(select))
Ваше текстовое свойство не будет нулевым, оно будет пустой строкой, и вы входите в этот раздел, когда считаете, что это не так.
РЕДАКТИРОВАТЬ:
Основываясь на ваших комментариях, я собираюсь направить вас к этому решению, заменив всю вашу функцию удаления чем-то вроде этого:
private void button6_Click(object sender, EventArgs e)
{
foreach (ListViewItem eachItem in listView1.SelectedItems)
{
listView1.Items.Remove(eachItem);
if (pths.Any(o => o == eachItem.Text))
{
pths.Remove(eachItem.Text);
}
if (rec.Any(o => o == eachItem.Text))
{
rec.Remove(eachItem.Text);
}
}
}
Вам может понадобиться каждый элемент. Значение вместо этого, но я думаю. Текст будет работать.
ПРИМЕЧАНИЕ. Этот ответ я просто скопировал отсюда (я не возражаю против этого решения):
Вы должны подтвердить свой SelectedItem
сначала, прежде чем пытаться удалить его из List
,
private void button6_Click(object sender, EventArgs e)
{
string select = (listView1.SelectedItems.Count > 0) ? (listView1.SelectedItems[0].Text) : null;
if (!string.IsNullOrWhiteSpace(select))
{
listView1.BeginUpdate();
pths.Remove(select);
rec.Remove(select);
listView1.EndUpdate();
string s = String.Join("; ", pths.ToArray());
string r = String.Join("; ", rec.ToArray());
}
Disp();
}