Метод DataGridViewCell PaintErrorIcon

Я пытаюсь перезаписать значок ошибки определенного столбца в файле DataGridView. Я нашел некоторую информацию об этом в Интернете, но метод PaintErrorIcon из моего пользовательского класса никогда не вызывается. Чтобы проверить, я добавил переопределение для обычного Paint и, используя тестовый код ниже, я получаю «PAINT» в своем выводе, но когда я устанавливаю errorText в ячейки, я не вижу «ERROR PAINT» (ячейки ДЕЙСТВИТЕЛЬНО получают значок ошибки, и при установке текста ошибки вызывается Paint).

public class DataGridViewWarningCell: DataGridViewTextBoxCell
{
    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)
    {
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        Console.WriteLine("PAINT");
    }

    protected override void PaintErrorIcon(Graphics graphics, Rectangle clipBounds, Rectangle cellValueBounds, string errorText)
    {
        base.PaintErrorIcon(graphics, clipBounds, cellValueBounds, errorText);
        Console.WriteLine("ERROR PAINT");
    }
}

Я добавил столбец в свой DataGridView следующим образом:

public class DataGridViewWarningColumn : DataGridViewColumn
{
    public DataGridViewWarningColumn()
    {
        this.CellTemplate = new DataGridViewWarningCell();
    }
}

Затем в моем коде формы:

var warningColumn = new DataGridViewWarningColumn();
fileGrid.Columns.Add(warningColumn);

person Bart Beyers    schedule 23.09.2014    source источник


Ответы (1)


Хм, кажется, без небольшого подталкивания это не сработает..

Вот что я пробовал, но вы, очевидно, захотите изменить настоящую графику.

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)
{
    base.Paint( graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
                formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
     Console.WriteLine("PAINT");
     // call it by hand:
     if (errorText != "")  PaintErrorIcon(graphics, clipBounds, cellBounds, errorText);
}

protected override void PaintErrorIcon(Graphics graphics, 
                        Rectangle clipBounds, Rectangle cellValueBounds, string errorText)
{
    // not the std icon, please
    //base.PaintErrorIcon(graphics, clipBounds, cellValueBounds, errorText);
    Console.WriteLine("ERROR PAINT");
    // aah, that's better ;-)
    graphics.FillRectangle(Brushes.Fuchsia, new Rectangle( clipBounds.Right - 10,   
             cellValueBounds.Y + 3, clipBounds.Right, cellValueBounds.Height - 6));
 }

Я отключил ShowCellErrors и закомментировал вызов базового метода.

Если вы не можете отключить ShowCellErrors для DGV, вам придется позаботиться о том, чтобы полностью перекрасить стандартную иконку, так как она все равно рисуется, даже если мы не вызываем base.PaintErrorIcon. Наверняка еще один симптом того, что что-то идет не так, как ожидалось.

Я не уверен насчет лучшего прямоугольника с границами, но, похоже, он что-то делает, так что это начало.

person TaW    schedule 24.09.2014
comment
Это то, что я в итоге сделал (сейчас экспериментировал с чем-то похожим, но ваш вклад сделал его завершенным, спасибо!) - person Bart Beyers; 25.09.2014