2016-07-12 10 views
1

私はwinformでDataGridViewを持っています。以下は、問題を再現する作業サンプルです。グリッドには、チェックボックスとテキストボックスの2つの列があります。私は2行のデータを作成しています。DataGridViewで複数の行を削除するにはどうすればよいですか?

私はループスルーし、チェックされた行を取得します。それから私はそれらを削除しようとします。行を削除しているループでは、最初の繰り返しでうまくいく。 r.Indexは0です。

第2の反復は、物事が崩壊するところです。 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に表示されます。 ToList()を使用

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

ので許可され、元のリストから項目を削除する、ループ内で使用され、我々はループで使用されるリストを変更しない異なるList<Data>を作成します。

別のオプションとして、DataGridViewから行を削除することもできます。変更は直ちにBindingListView<Data>で行われます。

dataGridView1.Rows.Cast<DataGridViewRow>() 
    .Where(row => (bool?)row.Cells[0].Value == true) 
    .ToList().ForEach(row => 
    { 
     dataGridView1.Rows.Remove(row); 
    }); 
関連する問題