选中时,DataGridView自定义单元格应使用普通的ForeColor

时间:2017-01-16 09:43:02

标签: c# .net winforms datagridview custom-controls

我制作了一些自定义DataGridViewTextBoxCell个实例。在大多数情况下,我设置了自定义ForeColor值,并且工作正常。但是当SelectionModeFullRowSelect时,它会覆盖此单元格的ForeColor值。

当我选择单元格时,我尝试在Draw事件中设置它,但它不起作用。

我的细胞定义如下。

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);
    }
}

我不想更改选择模式,但我希望显示此单元格的右ForeColor,但选择BackColor

这个解决方案怎么样?

1 个答案:

答案 0 :(得分:1)

您可以覆盖Paint单元格方法,并将cellStyle.SelectionForeColor设置为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);
}

注意:您可以使用CellFormattingCellPainting DataGridView事件执行相同操作,而无需创建自定义单元格。