2016-07-12 2 views
1

У меня есть DataGridView на winform. Ниже приведен рабочий образец, который воспроизводит проблему. Сетка имеет два столбца - флажок и текстовое поле. Я создаю две строки данных.Как удалить несколько строк в DataGridView?

Я просматриваю и проверяю строку. Затем я пытаюсь удалить их. В цикле, где я удаляю строки, все идет хорошо на первой итерации. r.Index - 0.

Входит во вторую итерацию, где происходит пробой. r.Index сейчас -1 и r.Cells[1].Value - null.

Почему это происходит и как правильно удалить эти строки?

public Form1() 
{ 
List<data> dataList = new List<data>(); 
dataList.Add(new data() {IsChecked=true, dept="dept1"}); 
dataList.Add(new data() {IsChecked=true, dept="dept2"}); 
BindingListView<data> view = new BindingListView<data>(dataList); 
dataGridView1.DataSource = view; 

var rows = SelectedRows(); 
foreach (DataGridViewRow r in rows) { 
    var name = r.Cells[1].Value.ToString(); 
    dataGridView1.Rows.Remove(r); 
} 

List<DataGridViewRow> SelectedRows() { 
    List<DataGridViewRow> rows = new List<DataGridViewRow>(); 
    foreach (DataGridViewRow row in dataGridView1.Rows) { 
    if (Convert.ToBoolean(row.Cells[0].Value)) { 
     rows.Add(row); 
    } 
    } 
    return rows; 
} 

} 


public class data 
{ 
    public bool IsChecked {get;set;} 
    public string dept {get;set;} 
} 

BindingListView класс приходит отсюда: http://blw.sourceforge.net

ответ

1

Вы можете удалить проверенный элемент из BindingListView<Data>. Изменения будут немедленно показаны в DataGridView.

foreach (var item in view.ToList()) 
{ 
    if (item.IsChecked) 
     view.Remove(item); 
} 

Использование ToList() создает различные List<Data>, который используется в цикле, так что удаление элемента из исходного списка допускается и не изменяет список, мы использовали в цикле.

Также как другой вариант, вы можете удалить строку из DataGridView таким образом. Изменения будут внесены в BindingListView<Data> немедленно:

dataGridView1.Rows.Cast<DataGridViewRow>() 
    .Where(row => (bool?)row.Cells[0].Value == true) 
    .ToList().ForEach(row => 
    { 
     dataGridView1.Rows.Remove(row); 
    }); 
Смежные вопросы