2012-03-14 22 views
6

POCO nesnelerine bağlı bir DataGridView var. POCO özelliklerinden biri, bir onay kutusuyla temsil edilen bir boole. İstediğim şey birden fazla satır seçebilmekti, sonra onay kutularından birine tıkladığımda, tüm vurgulanan satırların onay kutuları işaretli. Örnek olarak, VS 2010 altında TFS kullanıyorsanız, Bekleyen Değişiklikler ekranındaki davranışı çoğaltmaya çalışıyorum.DataGridView: Seçilen tüm satırlara bir düzenleme uygula

Sorunum, dinlemek için uygun bir etkinlik bulamıyorum. DataGridView tıklama etkinliklerinin çoğu, Sütun/Satır düzeyinde çalışacak gibi görünüyor ve onay kutusunu tıkladığınızda çıkan bir şey istiyorum. CellContentClick en yakın olanıdır, ancak'dan sonra yangınları seçilmemişse, bu işe yaramaz.

Herhangi bir öneriniz var mı?

+0

Tüm onay kutularını seçmek mi istiyorsunuz? – PraveenVenu

+0

Oldukça değil. Diyelim ki altı satırınız var ve 4 satırı seçiyorsunuz. Ardından, vurgulanan satırlardan birinde onay kutusunu tıklayıp durumunu Kontrol Edildi olarak değiştirirsiniz. Seçilen dört satırın tümü, önceki durumlarına bakılmaksızın, şimdi Kontrol Edilmelidir. – TarkaDaal

+0

Politikayı basit tut. Kullanıcı ızgaradaki satırı seçerken niçin Data Item satırının özellik değerini değiştirmiyorsunuz? GUI bir sınır denetimi olarak güncellenir. –

cevap

10

CheckCatch değeri değiştiğinde CurrentCellDirtyStateChanged öğesini kullanabilirsiniz. Ancak bu olay tetiklendiğinde, seçili satırlar silinir. Yapmanız gereken tek şey, önceden seçilmiş olanları kaydetmektir.

Basit bir örnek: kolayca tamamlayabilirsiniz.

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

Bu güzel bir tasarım değil, ancak (seçimi değiştirmek ızgara önce tetikleyecek) MouseDown olayı kullanmayı deneyebilirsiniz ve HitTest (kullanıcı tıklayarak olduğunu bilmek):

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); 
     } 
    } 
}