2016-11-22 3 views
0

У меня есть этот класс:Удалить строку из DataGridView, а также из списка

public class Product 
{ 
    public int ProdID { get; set; } 
    public string ProdName { get; set; } 
} 

Теперь для создания списка:

public static List<Product> Products = new List<Product>(); 

Чтобы заполнить datadridview с пользовательскими столбцами я использую:

productsTable.Columns.Add("IDColumn", "ID of the product"); 
productsTable.Columns.Add("NameColumn", "Name of the product"); 

foreach (var product in Products) 
{ 
    productsTable.Rows.Add(product.ProdID, product.ProdName); 
} 

У меня есть кнопка для удаления из строки:

private void buttonDeleteProduct_Click(object sender, EventArgs e) 
{ 
    int selectedIndex = productsTable.CurrentCell.RowIndex; 
    if (selectedIndex > -1) 
    { 
     productsTable.Rows.RemoveAt(selectedIndex); 
    } 
} 

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

+0

'Products.RemoveAt (SelectedIndex)' необходимо удалить из '' Список . – abdul

+0

@abdul Но как насчет того, когда таблица скремблирована или с некоторыми отфильтрованными элементами? Индекс не будет соответствовать списку. – Hypister

ответ

0

Получить productId от DataGrid и использовать его для поиска продукта от List<Product>, то вы можете удалить его:

int productId = (int)productsTable.Rows[selectedIndex].Cells[0].Value; 
var product = products.FirstOrDefault(p => p.Id == productId); 
if (product != null) 
    products.Remove(product); 
+0

Спасибо! Удаление с помощью идентификации идентификатора, которое является уникальным, работало очень хорошо. Я уже думал об этом решении, но я не знал, как его реализовать. – Hypister

1

Вам не нужно, что цикл по каждому элементу для заполнения сетки, вы можете использовать DataPropertyName из в GridView столбцов и пусть они делают работу за вас:

productsTable.Columns.Add(new DataGridViewTextBoxColumn 
{ 
    Name = "IDColumn", 
    DataPropertyName = "ProdID", 
    HeaderText = "ID of the product" 
}); 

productsTable.Columns.Add(new DataGridViewTextBoxColumn 
{ 
    Name = "NameColumn", 
    DataPropertyName = "ProdName", 
    HeaderText = "Name of the product" 
}); 

Учитывая приведенный выше код, вы можете просто установить свой список продуктов, как DataSource вашего DataGridView, как это:

productsTable.DataSource = Products; 

Что касается вашего вопроса, учитывая, что вы использовали код выше, вы можете удалить выбранную строку и «обновить» сетку со следующим кодом:

if (productsTable.CurrentRow != null) 
{ 
    Products.RemoveAt(productsTable.CurrentRow.Index); 
    productsTable.DataSource = Products.ToList(); 
} 

EDIT: Просто, чтобы сделать что вы удалили нужный продукт в случае индексы различаются, вы можете удалять элементы, как это:

if (productsTable.CurrentRow != null) 
{ 
    Product prod = (Product)productsTable.CurrentRow.DataBoundItem; 
    Products.Remove(prod); 
    productsTable.DataSource = Products.ToList(); 
} 
+0

Благодарим за решение. Я уже использую abdul's one, удаляя по ID, но ваше решение тоже приятно! – Hypister

Смежные вопросы