2012-03-14 11 views
6

私は、POCOオブジェクトのリストにバインドされたDataGridViewを持っています。 POCOプロパティの1つはboolです。これはチェックボックスで表されます。私が望むのは、複数の行を選択できるようにすることです。次に、チェックボックスの1つをクリックすると、強調表示されたすべての行にチェックボックスがオンになります。たとえば、VS 2010でTFSを使用している場合、[保留中の変更]画面でその動作を複製しようとしています。DataGridView:選択したすべての行に編集を適用します。

私の問題は、聞くのに適したイベントが見つからないということです。ほとんどのDataGridViewクリックイベントはColumn/Rowレベルで動作するように見えますが、チェックボックスをクリックすると発生するものが必要です。 CellContentClickが一番近いですが、の後にの行が選択されていないので、それは動作しません。

誰にも提案はありますか?

+0

[すべてを選択]チェックボックスがあることを意味しますか? – PraveenVenu

+0

6つの行があり、4つの行が強調表示されているとします。次に、強調表示された行のいずれかのチェックボックスをクリックし、その状態を[チェック済み]に変更します。以前選択した状態に関係なく、選択された4つの行はすべて[Checked]になります。 – TarkaDaal

+0

ポリシーは簡単です。ユーザーがグリッド内の行を選択しているときに、行データ項目のプロパティ値を変更しないでください。 GUIはバウンドコントロールとしてGUIを更新します。 –

答えて

10

CurrentCellDirtyStateChangedは、チェックボックスの値が変更されたときに使用できます。しかし、このイベントがトリガされると、選択されたロウがなくなります。あなたがするべきことは、それの前に選択されたロウを保存することだけです。

簡単なサンプル:簡単に完了できます。

DataGridViewSelectedRowCollection selected; 

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    DataGridView dgv = (DataGridView)sender; 
    DataGridViewCell cell = dgv.CurrentCell; 
    if (cell.RowIndex >= 0 && cell.ColumnIndex == 1) // My checkbox column 
    { 
     // If checkbox value changed, copy it's value to all selectedrows 
     bool checkvalue = false; 
     if (dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true)) 
      checkvalue = true; 

     for (int i=0; i<selected.Count; i++) 
      dgv.Rows[selected[i].Index].Cells[cell.ColumnIndex].Value = checkvalue; 
    } 

    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    selected = dataGridView1.SelectedRows; 
} 
1

これは素敵なデザインではなく、あなたが(選択を変更し、グリッドの前にトリガーされます)MouseDownイベントを使用しようとすることができ、およびHitTestは、(ユーザーがクリックしている場所を知る):

private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    var hitTest = this.dataGridView1.HitTest(e.X, e.Y); 
    if (hitTest.Type == DataGridViewHitTestType.Cell && hitTest.ColumnIndex == 0 /* set correct column index */) 
    { 
     foreach (DataGridViewRow row in this.dataGridView1.Rows) 
     { 
      // Toggle 
      row.Cells[0].Value = !((bool)row.Cells[0].Value); 
     } 
    } 
} 
関連する問題