Ошибка отображения просмотра списка со строками списка в 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);
    }
  }
}

Вам может понадобиться каждый элемент. Значение вместо этого, но я думаю. Текст будет работать.

ПРИМЕЧАНИЕ. Этот ответ я просто скопировал отсюда (я не возражаю против этого решения):

Удалить выбранный элемент из ListView

Вы должны подтвердить свой 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();
    }
Другие вопросы по тегам