Question

J'ai un DataGridView lié à une liste d'objets, et je définir une couleur de fond de cellule dynamique en utilisant l'événement CellFormatting, comme dans cette réponse . Cela fonctionne bien pour chaque colonne, sauf la DataGridViewCheckboxColumn. Lorsque je clique sur l'intérieur de cette cellule (mais en dehors de la case à cocher) les changements de fond de la cellule au blanc par défaut.

Visuellement, il ressemble à la sélection des cellules se produit, malgré tous mes efforts pour l'arrêter. Mon code cellule mise en forme définit le SelectionBackColor ainsi que la BackColor. J'ai la sélection de cellules désactivée en utilisant l'événement CellStateChanged, et aucun des autres colonnes sont sélectionnables:

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

Y at-il une solution de contournement supplémentaire pour remplacer le comportement cellulaire pour les cases à cocher?

Était-ce utile?

La solution

Je l'ai trouvé une solution de contournement en ajoutant le code suivant à l'événement CellStateChanged:

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

(BackgroundColor() calcule la couleur de fond de la cellule sur la base de la ligne.)

Ce guérit le problème, mais pourrait causer des problèmes de performance pour les grandes tables ou virtuels, en provoquant la création d'objets de style supplémentaires.

Autres conseils

Je aime bien cette approche pour ce que je fais. Il est capable de agnostically changer la couleur de fond (y compris Checkbox) de l'une des cellules DataGridView avec un clic de souris ou Tab - à titre d'exemple - pour mettre en évidence la cellule actuellement sélectionnée. J'ai trouvé d'autres approches curieusement ne colorent pas l'arrière-plan de la case à cocher que d'autres types de cellules ont été colorées. Dans mon exemple, j'utilise cette approche en cas CellFormatting mais je crois une syntaxe similaire peut être reproduit avec succès ailleurs. Aussi, je crois que cela répond à de plus près la question OPs il se réfère, en particulier, l'événement 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;

         }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top