2009-08-06 38 views
17

Tôi đã thêm một cột hộp kiểm vào một DataGridView trong biểu mẫu C# của tôi. Chức năng cần phải năng động - bạn chọn một khách hàng và mang đến tất cả các mục của họ có thể được phục vụ, và bạn chọn cái nào trong số họ bạn muốn được phục vụ lần này.cột hộp kiểm DataGridView - giá trị và chức năng

Dù sao, mã bây giờ sẽ thêm một hộp chckbox vào đầu DGV. Những gì tôi cần biết là:

1) Làm cách nào để tạo cột sao cho toàn bộ cột được "kiểm tra" theo mặc định? 2) Làm cách nào để đảm bảo rằng tôi chỉ nhận được các giá trị từ hàng "đã kiểm tra" khi tôi nhấp vào nút ngay bên dưới DGV?

Dưới đây là đoạn code để chèn cột:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "0"; 
      doWork.TrueValue = "1"; 
      dataGridView1.Columns.Insert(0, doWork); 

Vì vậy, những gì tiếp theo? Bất kỳ trợ giúp nào sẽ được đánh giá cao!

Trả lời

36
  1. Không có cách nào để làm điều đó trực tiếp. Một khi bạn có dữ liệu của bạn trong lưới, bạn lặp qua các hàng và có thể kiểm tra từng hộp như thế này:

    foreach (DataGridViewRow row in dataGridView1.Rows) 
    { 
        row.Cells[CheckBoxColumn1.Name].Value = true; 
    } 
    
  2. Các sự kiện Click có thể trông như thế này:

    private void button1_Click(object sender, EventArgs e) 
    { 
        List<DataGridViewRow> rows_with_checked_column = new List<DataGridViewRow>(); 
        foreach (DataGridViewRow row in dataGridView1.Rows) 
        { 
         if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true) 
         { 
          rows_with_checked_column.Add(row); 
         } 
        } 
        // Do what you want with the check rows 
    } 
    
+1

Cảm ơn rất nhiều! Điều đó thực sự hữu ích, nhưng chỉ một điều ... khi tôi đến điểm đó, để lấy thông tin từ các hàng đã chọn, làm cách nào để lấy thông tin từ một ô cụ thể (ví dụ giá trị ô trong cột 2 của tất cả các ô đã chọn) Ngoài ra ... bạn thực sự dường như biết nội dung của bạn cho C#, bất kỳ sách nào bạn có thể đề xuất? Cảm ơn. –

+0

Thực ra, đừng bận tâm đến điều đó, tôi đã tìm ra cách để làm điều đó. Cảm ơn một lần nữa vì sự giúp đỡ của bạn! –

+1

Rất vui khi bạn tìm thấy nó. Đối với một cuốn sách để giới thiệu, tôi không thể nói rằng tôi biết về bất kỳ cho việc học C#. Tôi sử dụng trang web msdn (http://msdn.microsoft.com/en-us/library/ms229335.aspx) để tìm kiếm các phương pháp/thuộc tính/mô tả/ví dụ/v.v., vì vậy tôi sẽ nói rằng đó có thể là tốt nhất tham khảo, oh một SO quá;) – SwDevMan81

13
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); 
    ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0]; 

    if (ch1.Value == null) 
     ch1.Value=false; 
    switch (ch1.Value.ToString()) 
    { 
     case "True": 
      ch1.Value = false; 
      break; 
     case "False": 
      ch1.Value = true; 
      break; 
    } 
    MessageBox.Show(ch1.Value.ToString()); 
} 

giải pháp tốt nhất để tìm xem hộp kiểm trong chế độ xem dữ liệu có được chọn hay không.

+0

Cảm ơn, hoạt động tuyệt vời! Để xử lý sự kiện chỉ khi ô có hộp kiểm: '// .... DataGridView dgv = (DataGridView) người gửi; if (dgv.CurrentCell.GetType()! = Typeof (DataGridViewCheckBoxCell)) { trả lại; } // ... ' – illagrenan

+0

Cảm ơn câu trả lời tuyệt vời! –

+1

cảm ơn @Nazeer chỉ cần một chút chỉnh sửa đối với đoạn mã của bạn 'if (ch1.Value == null) ch1.Value = false; ! ch1.Value = (bool) ch1.Value; ' thay 'switch (ch1.Value.ToString()) { trường hợp "True": ch1.Value = false; phá vỡ; trường hợp "False": ch1.Value = true; phá vỡ; } ' phiên bản nhỏ gọn ' if (ch1.Value == null) ch1.Value = false; ch1.Value =! (Bool) ch1.Value; ' –

3

tôi mất nhiều thời gian để tìm hiểu cách thực hiện điều này mà không phải lặp qua tất cả các bản ghi. Tôi có một nguồn dữ liệu ràng buộc ràng buộc, và tất cả các trường bị ràng buộc ngoại trừ cột hộp kiểm. Vì vậy, tôi không có/cần một vòng lặp để thêm mỗi hàng và tôi không muốn tạo ra một chỉ cho purpuse này. Vì vậy, sau rất nhiều cố gắng cuối cùng tôi đã nhận nó. Và nó cũng rất đơn giản:

Trước tiên, bạn thêm tệp .cs mới vào dự án của mình bằng ô kiểm tra tùy chỉnh, ví dụ:

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms; 

namespace MyNamespace { 
    public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell { 
     public DataGridViewCheckboxCellFilter() : base() { 
      this.FalseValue = 0; 
      this.TrueValue = 1; 
      this.Value = TrueValue; 
     } 
    } 
} 

Sau này, trên GridView của bạn, nơi bạn thêm vào hộp kiểm cột, bạn làm:

// add checkboxes 
DataGridViewCheckBoxColumn col_chkbox = new DataGridViewCheckBoxColumn(); 
{ 
    col_chkbox.HeaderText = "X"; 
    col_chkbox.Name = "checked"; 
    col_chkbox.CellTemplate = new DataGridViewCheckboxCellFilter();     
} 
this.Columns.Add(col_chkbox); 

Và đó là nó! Mỗi lần hộp kiểm của bạn được thêm vào một hàng mới, chúng sẽ được đặt thành true. Tận hưởng!

+0

Tôi thích việc triển khai này tốt nhất. Có vẻ như hiệu suất nhanh nhất khôn ngoan. Bạn không phải làm bất kỳ vòng lặp nào. –

+0

Đây là câu trả lời cho câu hỏi. Cảm ơn bạn. – EllieK

4

Dưới đây là một câu trả lời lót cho câu hỏi này

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList(); 
+0

+1 chỉ là những gì tôi đang tìm kiếm Rob, Cảm ơn. Lưu ý: Tôi đã nhận được một đối tượng không thiết lập ngoại lệ DBNUll, vì vậy tôi đã thay đổi mã của bạn thành điều này: '// tìm các hàng đã chọn - trong một dòng của lòng tốt Lamba - mà không cần hoãn thi hành! Danh sách selectedSeriesCodes = gridSeriesList.Rows.Cast (), ở đâu (g =>! String.IsNullOrEmpty (g.Cells ["Selected"]. Value.ToString()) && Convert.ToBoolean (g.Cells ["Selected"]. Value) == đúng) .ToList(); ' –

+0

tôi thấy nhưng trong tôi nó hoạt động, anh chàng chào đón của bạn. – Rob

1

Nếu bạn có một GridView chứa nhiều hơn một hộp kiểm .... bạn nên thử loại này ....

Object[] o=new Object[6]; 

for (int i = 0; i < dgverlist.RowCount; i++) 
{ 
    for (int j = 2; j < dgverlist.ColumnCount; j++) 
    { 
     DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); 
     ch1 = (DataGridViewCheckBoxCell)dgverlist.Rows[i].Cells[j]; 

     if (ch1.Value != null) 
     { 
      o[i] = ch1.OwningColumn.HeaderText.ToString(); 

      MessageBox.Show(o[i].ToString()); 
     } 
    } 
} 
3

Nếu bạn thử nó trên CellContentClick Event

Sử dụng:

dataGridView1.EndEdit(); //Stop editing of cell. 
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()); 
0

Để kiểm tra nếu cột được kiểm tra hay không:

for (int i = 0; i < dgvName.Rows.Count; i++) 
{ 
    if ((bool)dgvName.Rows[i].Cells[8].Value) 
    { 
    // Column is checked 
    } 
} 
1

1) Làm thế nào để làm cho sao cho toàn bộ cột được "kiểm tra" theo mặc định?

var doWork = new DataGridViewCheckBoxColumn(); 
doWork.Name = "IncludeDog" //Added so you can find the column in a row 
doWork.HeaderText = "Include Dog"; 
doWork.FalseValue = "0"; 
doWork.TrueValue = "1"; 

//Make the default checked 
doWork.CellTemplate.Value = true; 
doWork.CellTemplate.Style.NullValue = true; 

dataGridView1.Columns.Insert(0, doWork); 

2) Làm cách nào để đảm bảo rằng tôi chỉ nhận được giá trị từ hàng "đã kiểm tra"?

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    if (row.IsNewRow) continue;//If editing is enabled, skip the new row 

    //The Cell's Value gets it wrong with the true default, it will return   
    //false until the cell changes so use FormattedValue instead. 
    if (Convert.ToBoolean(row.Cells["IncludeDog"].FormattedValue)) 
    { 
     //Do stuff with row 
    } 
} 
0

nếu u làm cho cột này trong cơ sở dữ liệu sql (bit) như là một kiểu dữ liệu u nên sửa mã này

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "0"; 
      doWork.TrueValue = "1"; 
      dataGridView1.Columns.Insert(0, doWork); 

với điều này

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "False"; 
      doWork.TrueValue = "True"; 
      dataGridView1.Columns.Insert(0, doWork); 
Các vấn đề liên quan