Получение списка выделенных строк в datagridview C#

Данные заношу в dataGridView из следующего списка: public List<Fruit> Fruits = new List<Fruit>(); Сам класс:

    public class Fruit
    {
        public string Name { get; set; }
        public int Calories { get; set; }
        public string Color { get; set; }
        public double Rating { get; set; }
    }

Есть кнопка на форме, когда пользователь выделяет одну или несколько строк и нажимает на removebutton, то мы должны считывать индексы выделенных строк в список, а потом удалять из списка Fruits элементы по индексу. Сама кнопка:

  private void removebtn_Click(object sender, EventArgs e)
        {
            List<int> mass = dataGridView1.SelectedRows.Cast<DataGridViewRow>().Select
            (
                 x => x.Index
            ).ToList();
            for (int i = 0; i < mass.Count; i++)
            {
                Fruits.RemoveAt(mass[i]);
            }
            dataGridView1.DataSource = Fruits;
        }

Здесь же при запуске получаем следующую картину: при выделении любого количества строк mass остается пустым, следовательно ничего не удаляется.


Ответы (1 шт):

Автор решения: RustySkull

Из опыта работы с формами и конкретно DevExpress'ом могу сказать следующее.

  1. Вместо простого List во всех DataGridView нужно использовать BindingList
  2. После того, как вы запрашиваете SelectedItems вам нужно просто выполнить их Remove() в BindingList на уровне бизнес-логики, что приведет к автоматическому обновлению таблицы

Конкретно внутреннюю механику работы DataGridView рассказать не могу, но простой List не вызывает обновление грида, в отличии от BindingList

public BindingList<Fruit> Fruits = new BindingList<Fruit>();
if (dataGridView1.SelectedRows.Count > 0)
{
    IEnumerable<object> selectedItems = dataGridView1.SelectedRows
        .Cast<DataGridViewRow>()
        .Select(x => x.DataBoundItem);

    foreach (object item in selectedItems)
    { 
        if (item is Fruit fruit) Fruits.Remove(fruit); 
    }
}
→ Ссылка