Domanda

Ho un DataGridView legato ad un elenco di oggetti, e sto impostando un colore di sfondo delle celle dinamica utilizzando l'evento CellFormatting, come in questa risposta . Questo metodo funziona bene per ogni colonna, tranne il DataGridViewCheckboxColumn. Quando clicco all'interno di questa cella (ma al di fuori della casella di controllo) i cambiamenti di fondo cella al bianco di default.

Visivamente sembra che la selezione delle cellule è in corso, nonostante i miei sforzi per fermarlo. Il mio codice formattazione delle celle imposta la SelectionBackColor così come il BackColor. Ho selezione di celle disabilitato utilizzando l'evento CellStateChanged, e nessuna delle altre colonne sono selezionabili:

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

C'è un soluzione in più per ignorare il comportamento delle cellule per caselle di controllo?

È stato utile?

Soluzione

Ho trovato una soluzione aggiungendo il seguente codice all'evento CellStateChanged:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() calcola il colore di sfondo della cella sulla base della riga.)

Questo risolve il problema, ma potrebbe causare problemi di prestazioni per i tavoli più grandi o virtuali, provocando la creazione di oggetti di stile in più.

Altri suggerimenti

I po 'come questo approccio per quello che sto facendo. E 'in grado di cambiare colore di sfondo agnosticamente (compresa Casella di controllo) di una qualsiasi delle cellule DataGridView con un clic del mouse o Tab - a scopo di esempio - per evidenziare la cella selezionata. Ho trovato altri approcci stranamente non colorare lo sfondo della casella di controllo, come altri tipi di cellule sono state colorate. Nel mio esempio, sto utilizzando questo approccio in caso CellFormatting ma credo che una sintassi simile può essere duplicato con successo altrove. Inoltre, credo che questo risponde più da vicino la questione PO come esso si riferisce, in particolare, l'evento CellFormatting.

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top