Получение списка выделенных строк в 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 шт):
Из опыта работы с формами и конкретно DevExpress'ом могу сказать следующее.
- Вместо простого
Listво всехDataGridViewнужно использоватьBindingList - После того, как вы запрашиваете
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);
}
}