2012-03-14 44 views
6

Tôi có một DataGridView được liên kết với danh sách đối tượng POCO. Một trong các thuộc tính POCO là một bool, được biểu diễn bằng một hộp kiểm. Điều tôi muốn là có thể chọn nhiều hàng, sau đó khi tôi nhấp vào một trong các hộp kiểm, tất cả các hàng được đánh dấu có các hộp kiểm được chọn. Bằng ví dụ, nếu bạn đang sử dụng TFS dưới VS 2010, tôi đang cố gắng sao chép hành vi trên màn hình Thay đổi đang chờ xử lý.DataGridView: Áp dụng chỉnh sửa cho tất cả các hàng đã chọn

Vấn đề của tôi là tôi không thể tìm thấy sự kiện phù hợp để nghe. Hầu hết các sự kiện click DataGridView dường như hoạt động ở cấp độ Column/Row, và tôi muốn cái gì đó kích hoạt khi bạn nhấp vào hộp kiểm. CellContentClick đến gần nhất, nhưng các đám cháy đó sau các hàng đã được bỏ chọn, vì vậy nó sẽ không hoạt động.

Có ai có bất kỳ đề xuất nào không?

+0

Bạn có ý định chọn một hộp kiểm không? – PraveenVenu

+0

Không hoàn toàn. Giả sử bạn có sáu hàng và bạn đánh dấu/chọn 4 hàng. Sau đó, bạn nhấp vào hộp kiểm ở một trong các hàng được đánh dấu đó, thay đổi trạng thái của nó thành Đã kiểm tra. Tất cả bốn hàng đã chọn bây giờ sẽ được Kiểm tra, bất kể trạng thái trước đó của chúng. – TarkaDaal

+0

Giữ cho nó đơn giản là chính sách. tại sao bạn không thay đổi giá trị thuộc tính cho hàng Dữ liệu đúng trong khi người dùng đang chọn hàng trong lưới. sẽ cập nhật GUI làm điều khiển ràng buộc của nó. –

Trả lời

10

Bạn có thể sử dụng CurrentCellDirtyStateChanged khi giá trị Checkbox thay đổi. Nhưng khi sự kiện này kích hoạt, các lựa chọn sẽ biến mất. Tất cả những gì bạn cần làm là lưu các dòng đã chọn trước đó.

Mẫu đơn giản: bạn có thể hoàn thành nó dễ dàng.

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

Đây không phải là một thiết kế đẹp, nhưng bạn có thể cố gắng sử dụng các sự kiện MouseDown (mà sẽ kích hoạt trước khi lưới điện thay đổi lựa chọn) và hitTest (để biết được nơi người dùng nhấp chuột):

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); 
     } 
    } 
} 
Các vấn đề liên quan