2013-09-04 18 views
9

Znalazłem wiele podobnych pytań i odpowiedzi, ale żadna nie pomogła mi rozwiązać mojego problemu.Jak wyłączyć (tylko odczyt) komórkę w kolumnie CheckBox DataGridView na podstawie wartości w innych komórkach?

Proszę znaleźć mojego DataGridView poniżej,

enter image description here

Co chcę zrobić, to wyłączyć pole wyboru, jeśli nazwa komórka jest pusta w czasie wykonywania.

Próbowałem metod may, ale przez cały czas komórka jest wyłączona (tylko do odczytu) po sprawdzeniu.

EDIT

Próbowałem coś takiego,

private void sendDGV_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (sendDGV.CurrentRow.Cells[1].Value != null) 
     { 
      sendDGV.CurrentRow.Cells[2].ReadOnly = false; 
      sendDGV.Update(); 
     } 
     else 
     { 
      sendDGV.CurrentRow.Cells[2].ReadOnly = true; 
      sendDGV.Update(); 
     } 
} 
+0

Co pan spróbować? Najłatwiejszy sposób użycia jquery –

+1

@FlaviaObreja wygląda jak aplikacja formularzy, a nie aplikacja internetowa. –

+0

kopalnia to formularz wniosku – Jake

Odpowiedz

8

Aby obsłużyć zmiany w kolumnie nazwa, można użyć zdarzenia DataGridView.CellValueChanged. Parametr e daje dostęp do:

  • columnIndex nieruchomości, dzięki czemu można sprawdzić, czy zmiana jest dokonywana na nazwa kolumny (indeks 1). Właściwość
  • rowIndex, aby pobrać odpowiedni wiersz i zmienić żądane wartości.

private void DataGridView1_CellValueChanged(object sender, System.Windows.Forms.DataGridViewCellEventArgs e) 
{ 
    //second column 
    if (e.ColumnIndex == 1) { 
     object value = DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; 
     if (value != null && value.ToString() != string.Empty) { 
      DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = false; 
     } else { 
      DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = true; 
     } 
    } 
} 

EDIT

Jak ktoś zauważył, w celu zainicjowania działań checkbox wyłączone dla nowych dodawanych wierszy (zwłaszcza jeżeli nieruchomość AllowUserToAddRow jest ustawiony na true), można obsłużyć zdarzenie RowAdded:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{ 
    DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = true; 
} 
+1

Dzięki Chris. To działa dla mnie. :) – Jake

3

Można użyć DataGridView.CellValueChanged zdarzenie:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.RowIndex >= 0) 
     { 
      if (e.ColumnIndex == 1 && dataGridView1[1, e.RowIndex].Value.ToString() != "") 
       dataGridView1[2, e.RowIndex].ReadOnly = false; 
      else 
       dataGridView1[2, e.RowIndex].ReadOnly = true; 
     } 
    } 

Jednak aby mieć pole wyboru disbled najpierw upewnij się ustawić kolumnę być tylko do odczytu przy użyciu projektanta, a także, w razie DataGridView.RowsAdded ustaw właściwość wyboru ReadOnly = true dla nowo utworzonego rzędu:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
    { 
     dataGridView1[2, e.RowIndex].ReadOnly = true; 
    } 
+0

+1 dla 'RowAdded'. Tęskniłem za tym punktem. – Chris

+1

Dzięki Flavia. Ale kiedy próbowałem tego przykładu, otrzymałem zerowy wyjątek odwołania w drugim warunku "jeśli". Więc zmodyfikowałem go do czegoś podobnego poniżej 'if (e.ColumnIndex == 1 && dataGridView1 [1, e.RowIndex] .Value! = Null)' i teraz działa dobrze. – Jake

2

Proste, jest wbudowana tylko do odczytu nieruchomość w Visual Studio, oznaczyć ją jako prawdziwy

1

Dość o ld wątku, ale myślę, że możesz użyć zdarzenia CellBeginEdit i anulować wydarzenie w swoim stanie. Nie wyłącza kolumny, ale raczej anuluje edycję żądanej wartości kolumny.

1) objęcia imprezy:

this.dataGridView1.CellBeginEdit += DataGridView1OnCellBeginEdit; 

2) obsługi zdarzeń:

 private void DataGridView1OnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs args) 
    { 
     var isTicked = this.dataGridView1.Rows[args.RowIndex].Cells[args.ColumnIndex].Value; 

     args.Cancel = (isTicked is bool) && ((bool)isTicked); 
    } 

Użyłem zdarzenie, aby uzyskać jedno pole wyboru integracyjnego.

Oznacza to tylko jedno z trzech kolumn ("None", "Read", "Full") może być "prawdziwe"

enter image description here