2012-03-14 100 views
6

我有一個綁定到POCO對象列表的DataGridView。其中一個POCO屬性是一個bool,用複選框表示。我想要的是能夠選擇多行,然後當我點擊其中一個複選框時,所有突出顯示的行都會選中它們的複選框。舉例來說,如果您在VS 2010下使用TFS,我試圖在Pending Changes屏幕上覆制行爲。DataGridView:將編輯應用於所有選定的行

我的問題是我無法找到合適的事件來收聽。大多數DataGridView點擊事件似乎在列/行級別運行,並且我希望點擊複選框時觸發某些事件。 CellContentClick最接近,但在之後觸發行被取消選中,所以這不起作用。

有沒有人有任何建議?

+0

你的意思是選擇全部複選框? – PraveenVenu 2012-03-14 13:35:54

+0

不完全。假設您有六行,並突出顯示/選擇4行。然後點擊其中一個突出顯示的行中的複選框,將其狀態更改爲「已檢查」。現在,所有四個選定的行都應該被選中,無論它們以前的狀態如何。 – TarkaDaal 2012-03-14 15:15:24

+0

保持簡單就是保單。當用戶選擇網格中的行時,爲什麼不讓數據項的屬性值更改爲true?這將更新GUI作爲其綁定控件。 – 2012-03-20 14:49:17

回答

10

當Checkbox值發生變化時,您可以使用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); 
     } 
    } 
} 
相關問題