Evento click su colonna checkbox in dataviewgrid

di SebastianoFloridia il
6 risposte

Salve a tutti, non ho molto dimestichezza con datagridview.

Devo scatenare l'evento su un click di checkbox non mi è chiaro come leggere il valore postclick utilizzando:

 if (DataGridNodi.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == "true")
{

mi aspettavo un valore booleano, ma trovo una stringa true o false.

Quali di questo evento è quello corretto per ottenere il valore post click.

 private void DataGridNodi_CellContentClick(object sender, DataGridViewCellEventArgs e)
{

   }

private void DataGridNodi_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)

{

   }

Il codice funziona, ma legge sempre false.

Cosa sbaglio?

Grazie

Sebastiano Floridia

6 Risposte

  • Grazie tante.

    Ci studio.

    Saluti

    Sebastiano

  • E' un piacere. Oltre ai due articoli segnalati, se cerchi in questa bellissimo sito, inserendo nella casella di testo "DatagridView" trovi altri articoli. 

    Buona programmazione. 

  • 17/01/2025 - SebastianoFloridia ha scritto:

    mi aspettavo un valore booleano, ma trovo una stringa true o false

    Ciao Sebastiano,

    mi viene il dubbio che tu modifichi una qualche proprietà di un oggetto. Non sarebbe meglio quindi creare l'apposito evento nella classe e gestire quello invece di andare a cercare il click?

  • 17/01/2025 - SebastianoFloridia ha scritto:

    Il codice funziona, ma legge sempre false.

    Cosa sbaglio?

    Ciao, per esempio puoi gestire l'evento in CellValueChanged in questo modo: (ma tutto dipende dallo scenario che hai)

    YourDataGridView = nome della tua datagrdiview

    YourColumnName = nome della colonna dove si trova la tua checkbox

            private void YourDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex >= 0)
                {
                    if (e.ColumnIndex == YourDataGridView.Columns["YourColumnName"].Index)
                    {
                        MessageBox.Show("New state: " + (bool)YourDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
                    }
                }
            }
    

    Sempre per Esempio a questo punto puoi testare lo stato della checkbox ed eseguire le azioni che ritieni opportuno :

            private void YourDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                // check rows exists
                if (e.RowIndex >= 0)
                {
                    // check if the column changed
                    if (e.ColumnIndex == YourDataGridView.Columns["YourColumnName"].Index)
                    {
                        // check checkbox status
                        if ((bool)YourDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)
                        {
                        	// perform the actions by state = true .....
                            MessageBox.Show("New state: True");
                        }
                        else
                        {
                        	// perform the actions by state = false .....
                            MessageBox.Show("New state: False");
                        }
                    }
                }
            }

    Quanto sopra solo un piccolo esempio usando un certo evento, ma come detto in precedenza tutto dipende dal tuo specifico scenario

  • 21/01/2025 - By65Franco ha scritto:

    Il codice funziona, ma legge sempre false.

    Cosa sbaglio?

    Ciao, scusa mi sono dimenticato l'aspetto che segnalavi nel post dove dicevi di ricevere sempre il valore = false...... 
    quindi se vuoi sapere all'istante se hai modificato il valore della checkbox e non dopo aver confermato l'edit, allora puoi usare la tecnica forzando il commit edit.

    Ti riporto l'esempio completo dove aggiungere l'evento appena descritto:

            // DATAGRIDVIEW - CHECK VALUE EVENT CHANGED FOR THE CURRENT CELL
    		private void YourDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                // check only checkbox cells
                if (YourDataGridView.CurrentCell is DataGridViewCheckBoxCell && YourDataGridView.IsCurrentCellDirty)
                {
                    // confirm commit change value
                    YourDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
    
            // DATAGRIDVIEW - CONTROLS EVENT VALUE CHANGING CELL
    		private void YourDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                // check rows exists
                if (e.RowIndex >= 0)
                {
                    // check if the column changed
                    if (e.ColumnIndex == YourDataGridView.Columns["YourColumnName"].Index)
                    {
                        // check checkbox status
                        if ((bool)YourDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)
                        {
                        	// perform the actions by state = true .....
                            MessageBox.Show("New state: True");
                        }
                        else
                        {
                        	// perform the actions by state = false .....
                            MessageBox.Show("New state: False");
                        }
                    }
                }
            }

    Rispetto all'esempio precedente, viene forzato endedit della cella/celle di tipo checkbox e sempre in evento CellValueChanged eseguirai il discrimine per quale checkbox (su quale colonna) eseguire le tue azioni al cambio di stato.

Devi accedere o registrarti per scrivere nel forum
6 risposte