Связанный список просмотра / удаление списка выбранных элементов

#c# #list #listview

#c# #Список #listview

Вопрос:

Я немного неясен в следующем, поэтому, чтобы прояснить ситуацию, моя конечная цель — создать кнопку для удаления значения, отображаемого в listview, значение является элементом списка.

Это то, чего я хочу…

 studentList.Remove(listView1.SelectedIndices);
refreshList(); 
  

конечно, если бы это сработало, я был бы на небесах, но, конечно, это выдает ошибки…

Список является private List<Student> studentList = new List<Student>() он сгенерирован из другой формы Windows.

У меня возникла проблема с удалением элементов из списка / viewlist, который я использую.

Вот код, который продолжает выдавать ошибки:

 private void buttonDelete_Click(object sender, EventArgs e)
{
    // studentList.RemoveAt(listBoxStudent.SelectedIndex);

    for (int i = 0; i < listView1.Items.Count; i  )
    {
        studentList.RemoveAt(listView1.Items[i].Selected));
        i--;
    }
    refreshList();
}
  

Значения помещаются в listview правильно, но, похоже, я не могу найти способ удалить значения из listview и списка вместе ( refreshlist() очищает и повторно заполняет listview в соответствии со списком studentList )

 private void refreshList()
{
    listView1.Items.Clear();
    foreach (Student stu in studentList)
    {
        string[] filler = new string[5];
        filler[0] = stu.Name.ToString();
        filler[1] = stu.Residency.ToString();
        filler[2] = stu.Credits.ToString();
        filler[3] = stu.Tuition.ToString();

        listView1.Items.Add(stu.Id.ToString()).SubItems.AddRange(filler);

        listView1.View = View.Details;
    }
}
  

редактировать: добавлено refreshlist() по запросу.

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

1. Можете ли вы добавить свой код refreshlist ()? Кроме того, зачем использовать цикл for для удаления элемента? Тем более, что в вашем цикле вы отрицаете свою переменную i, чтобы она не менялась?

2. добавлен refreshlist (), я действительно не уверен, какой наилучший способ удалить элементы, однако, поскольку это listview, в нем может быть выбрано несколько элементов, поэтому, насколько я понимаю, потребуется цикл. Все еще новичок в языке.

3. какова ваша цель с этим первым циклом, который содержит studentList.RemoveAt(..) — вы просто хотите удалить выбранный элемент? Если да, то почему цикл?

4. Я просто хочу удалить выбранный элемент, я не уверен, как настроить таргетинг на выбранные индексы в listview…

Ответ №1:

Крис,

Чувак, просто удали объект из списка (забудь RemoveAt (index)), затем обнови представление… он будет (или, по крайней мере, должен) извлекать изменения из «модели» (т. Е. списка студентов).

Метод List.Remove:http://msdn.microsoft.com/en-us/library/cd666k3e.aspx

Приветствия. Кит.

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

1. Проблема заключается в удалении элемента из списка по выбранному индексу … он выдает ошибки, когда я пытаюсь выбрать индекс.

2. понял, что ваш ответ наиболее релевантен.

Ответ №2:

попробуйте изменить свой цикл на

             for(int i = studentList.Items.Count -1; i>=0; i--)
            {
                if(studentList.Items[i].Selected == true)
                    studentList.Items[i].Remove();
            }
  

или другим способом

             foreach (ListViewItem lvi in studentList.Items)
            {
                if (lvi.Selected == true)
                    lvi.Remove();
            }
  

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

1. 1 Инвертирование цикла — это аккуратный способ обойти проблему с пропуском индекса.

2. Удалит ли удаление элемента ListViewItem учащегося из базового списка учащихся? Да: это вопрос. Очевидно, я подозреваю, что это не ОЧЕНЬ ХОРОШИЕ новости, но я не знаю наверняка.

3. возможно, я недостаточно четко сформулировал свой вопрос: (Я пытаюсь удалить из списка учащихся выбранные элементы в ListView. Я не пытаюсь удалить элемент из ListView, потому что это просто повторно заполнило бы вызов refreshlist ().

Ответ №3:

Обычно вы не пытались бы манипулировать обоими. Измените базовый источник данных (в вашем случае StudentList), затем обновите ListView. Если вы измените свой список учащихся, чтобы использовать ObservableCollection , это фактически обновит пользовательский интерфейс для вас.

Кроме того, если тип данных вашей коллекции поддерживает IComparable , вы должны просто иметь возможность использовать ListView1.Remove(), а не RemoveAt() .

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

1. Как мне удалить выбранный элемент в ListView? Список обновления будет обрабатывать ListView, мне просто нужно знать, как настроить таргетинг на выбранный элемент для удаления в StudentList…

Ответ №4:

Вы изменяете коллекцию, по которой пытаетесь выполнить итерацию. Как только вы удалили первый элемент, вы изменили список, поэтому цикл for выдаст вам сообщение об ошибке. Приведенный пример, который повторяется в обратном направлении (i —), является одним из способов решения проблемы.

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

1. Вы имеете в виду, что объяснение того, почему вы получаете ошибку, не помогло или повторение в обратном направлении по коллекции не помогло?

2. повторение обратных слов по коллекции. Теперь у меня все работает, хотя спасибо.