2009-10-13 13 views
9

Mam powiązana tabela danych do DataGridView, ta tabela danych ma kolumnę o nazwie "Status", która jest typu Boolean. Mogę ustawić wartość na true lub false dobrze za pomocą kodu.Jak sprawdzić, czy DataGridViewCheckBoxCell jest sprawdzana

Nie mogę jednak dowiedzieć się, jak sprawdzić, czy dany wiersz jest już sprawdzony czy nie. To jest kod, którego próbuję użyć, a kompilacja pokazuje błąd "określona obsada jest nieprawidłowa".

Każda pomoc zostanie doceniona.

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

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

Masz dwie odlewane W przykładzie kodu. Który z nich powoduje błąd? Przesyłając komórkę do DataGridViewCheckBoxCell lub przesyłając wartość do bool? –

+0

Być może nie jest to całkowicie związane z tym pytaniem, ale może to pomóc: https://stackoverflow.com/a/48465766/5750078 – Loaderon

Odpowiedz

0

CbxCell.Value musi być równa DBNull.Value (Twój kolumna może zawierać wartości null prawda?)

chciałbym sprawdzić DBNull przed odlewaniem:

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

Problem polega na tym, że domyślna wartość FALSE dla obiektu DataGridCheckBoxColumn ma wartość null, a wartość domyślna TRUE jest wartością logiczną True. Powoduje to problem, ponieważ wartości boolowskie nie są zerowalne. Możesz rozwiązać ten problem na dwa sposoby:

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

Innym sposobem rozwiązania tego problemu jest ustawienie wartości TrueValue kolumny na pewną wartość. Można to zrobić w czasie projektowania, jak pokazano:

enter image description here

Następnie można napisać:

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

To działa, ponieważ Struny są pustych.

Uwaga: mimo że ustawiłem FalseValue na F, wartość false nadal wydaje się być pusta, więc sugeruję ignorowanie właściwości FalseValue.

Jedna inna uwaga: JEŚLI umieścisz coś w TrueValue jak wyżej, a następnie chcesz go usunąć, wartość True staje się pusta (ouch), co wymaga usunięcia kolumny, a następnie ponownego jej dodania w celu przywrócenia jej do stan domyślny. Lub można ją zmienić w kodzie, co następuje:

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

Próbowałem pierwszego. Prace. Dzięki! –

+0

jest trochę dziwnie wyglądający, ale 'true.Equals (cbxCell.Value)' jest w porządku z 'null',' DBNull.Value' i domyślną wartością logiczną 'true'. – Slai

1

Innym zagadnieniem, które mogą wystąpić to:

Gdy użytkownik kliknie komórkę, aby zaznaczyć lub odznaczyć pole, wartość bazowych nie zostaną zmienione aż komórka straci ostrość.

Nie będzie to problemem, jeśli dany kod jest w przycisku, ponieważ po kliknięciu przycisku komórka utraci ostrość. Ale jeśli twój kod jest uruchamiany z timera, wciąż możesz sprawdzić "starą" wartość.

Zobacz inne moje odpowiedź tutaj: https://stackoverflow.com/a/22080846/1015072

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

Dziękuję wszystkim. Miałem ten sam problem, ale dowiaduję się, że pisanie senderGrid.EndEdit(), przed sprawdzeniem wartości, rozwiązuje to.

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

Bądź dobrej pracy

+0

Jeśli mogę przegłosować nieskończone czasy, zrobiłbym to dla tej odpowiedzi, zmagałem się z tym problemem, ale twoja odpowiedź to zrobiła. Super-ogromny szacunek! – 3bdalla

Powiązane problemy