2009-10-13 43 views
9

Tôi đã gắn bảng dữ liệu vào một số DataGridView, bảng dữ liệu này có cột được gọi là "Trạng thái" có loại Boolean. Tôi có thể đặt giá trị thành true hoặc false chỉ tốt bằng mã.Cách xác minh xem một DataGridViewCheckBoxCell có được kiểm tra

Tuy nhiên, tôi không thể tìm ra cách kiểm tra xem hàng đã cho đã được kiểm tra hay chưa. Đây là mã tôi đang cố gắng sử dụng và biên dịch nó cho thấy lỗi "các diễn viên được chỉ định là không hợp lệ".

Mọi trợ giúp sẽ được đánh giá cao.

if (rowIndex >= 0) 
{ 
    var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"]; 

    if ((bool)cbxCell.Value) 
    { 
     // Do stuff 
    } 
    else 
    { 
     // Do other stuff 
    } 
} 
+0

Bạn có hai phôi trong mã ví dụ của bạn. Cái nào gây ra lỗi? Đúc các tế bào vào một DataGridViewCheckBoxCell hoặc đúc giá trị cho một bool? –

+0

Có lẽ không hoàn toàn liên quan đến câu hỏi này, nhưng điều này có thể giúp: https://stackoverflow.com/a/48465766/5750078 – Loaderon

Trả lời

0

CbxCell.Value phải bằng DBNull.Value (cột của bạn có thể chứa giá trị null phải không?)

tôi sẽ kiểm tra cho DBNull trước khi đúc:

if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true) 
{ 
    //Do stuff 
} 
else 
{ 
    //Do Stuff 
} 
1
if (Convert.ToBoolean(dgvScan.Rows[rowIndex].Cells["Status"].Value)) 
{ 
//Do Something 
} 
else { 
// Do Something 
} 
8

vấn đề là giá trị FALSE mặc định cho một DataGridCheckBoxColumn là null, và giá trị TRUE mặc định là giá trị boolean True. Điều này gây ra một vấn đề bởi vì các giá trị boolean không phải là nullable. Bạn có thể giải quyết vấn đề này theo hai cách:

if (cbxCell.Value != null && (bool)cbxCell.Value) 
    { 
     do stuff; 
    } 

Cách khác để giải quyết điều này là đặt thuộc tính TrueValue của cột thành một số giá trị. Điều này có thể được thực hiện tại thời gian thiết kế như:

enter image description here

Sau đó, bạn có thể viết:

if ((string)cbxCell.Value == "T") 
    { 
     do stuff; 
    } 

này hoạt động vì Strings là nullable.

Xin lưu ý: Mặc dù tôi đặt FalseValue thành F nhưng giá trị giả vẫn có vẻ là rỗng, vì vậy, tôi khuyên bạn nên bỏ qua thuộc tính FalseValue.

Một lưu ý khác: NẾU bạn đặt một thứ gì đó trong TrueValue như trên và sau đó bị xóa để xóa nó, giá trị true trở thành rỗng (ouch), yêu cầu bạn xóa cột và sau đó thêm lại để khôi phục điều kiện mặc định. Hoặc bạn có thể thay đổi nó trong mã như sau:

((DataGridViewCheckBoxColumn)DataGridView1.Columns["Selected"]).TrueValue = true 
+0

Tôi đã thử câu hỏi đầu tiên. Công trinh. Cảm ơn! –

+0

nó hơi lạ, nhưng 'true.Equals (cbxCell.Value)' là ok với 'null',' DBNull.Value', và giá trị boolean 'true' mặc định. – Slai

1

Một vấn đề có thể gặp phải là điều này:

Khi người dùng nhấp vào tế bào để chọn hoặc bỏ chọn hộp, giá trị cơ bản sẽ không thay đổi cho đến khi tế bào mất tiêu điểm.

Đây sẽ không phải là vấn đề nếu mã được đề cập đến trong một nút, vì ô sẽ mất tiêu điểm khi bạn nhấp vào nút. Nhưng nếu mã của bạn được kích hoạt từ bộ hẹn giờ, bạn vẫn có thể kiểm tra giá trị 'cũ'.

Xem câu trả lời khác của tôi ở đây: https://stackoverflow.com/a/22080846/1015072

0
bool checked = cell.Value as bool? ?? false; 
2

Cảm ơn tất cả các bạn. Đã có cùng một vấn đề nhưng tôi tìm ra rằng viết senderGrid.EndEdit(), trước khi kiểm tra giá trị, giải quyết nó.

private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     var senderGrid = (DataGridView)sender; 
     senderGrid.EndEdit(); 

     if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn && 
      e.RowIndex >= 0) 
     { 

      var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"]; 
      if ((bool)cbxCell.Value) 
      { 
        // Criar registo na base de dados 
      } 
      else 
      { 
        // Remover registo da base de dados 
      } 
     } 
    } 

Giữ thành tốt công việc

+0

Nếu tôi có thể upvote vô hạn lần tôi sẽ làm điều đó cho câu trả lời này, tôi đã đấu tranh với vấn đề này nhưng câu trả lời của bạn đã làm nó. Sự tôn trọng siêu lớn! – 3bdalla

Các vấn đề liên quan