2017-01-16 3 views
1

J'ai créé des instances personnalisées DataGridViewTextBoxCell. Dans la plupart d'entre eux, j'ai mis ForeColor valeurs personnalisées et cela fonctionne bien. Mais lorsque le SelectionMode est FullRowSelect, il remplace mes valeurs ForeColor pour cette cellule.La cellule personnalisée DataGridView doit utiliser la propriété ForeColor normale lorsqu'elle est sélectionnée.

J'ai essayé de le définir dans l'événement Draw lorsque la cellule est sélectionnée, mais cela ne fonctionne pas.

Ma cellule est définde comme suit.

public class CustomCell : DataGridViewTextBoxCell 
{ 
    protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context) 
    { 
     if (string.IsNullOrEmpty(value.ToString())) 
     { 
      return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context); 
     } 

     if (value.ToString().Contains("test")) 
     { 
      cellStyle.ForeColor = Color.Blue; 
     } 
     return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context); 
    } 
} 

Je ne veux pas changer le mode de sélection, mais je veux montrer cette cellule avec son droit ForeColor mais la sélection BackColor.

À quoi la solution pourrait-elle ressembler?

Répondre

1

Vous pouvez remplacer Paint méthode de la cellule et mis cellStyle.SelectionForeColor à la même couleur de ForeColor:

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, 
    string errorText, DataGridViewCellStyle cellStyle, 
    DataGridViewAdvancedBorderStyle advancedBorderStyle, 
    DataGridViewPaintParts paintParts) 
{ 
    if (string.Format("{0}", formattedValue) == "something") 
    { 
     cellStyle.ForeColor = Color.Red; 
     cellStyle.SelectionForeColor = cellStyle.ForeColor; 
    } 
    base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
     formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts); 
} 

Note: Vous pouvez faire la même chose en utilisant événement CellFormatting ou CellPainting de DataGridView sans créer une cellule personnalisée.

+0

Merci, cela fonctionne. Je sais que je peux utiliser les événements. Mais j'ai beaucoup de cellules dans tout le programme qui devrait ressembler à des règles vraiment spéciales. Il était donc plus agréable de créer des cellules personnalisées pour cela. – Booser

+0

Vous connaissez mieux les exigences, je l'ai partagé juste pour votre information ou pour les futurs lecteurs :) –