Вот мой подход. Создав собственную ячейку, вы можете проверить, изменилось ли значение и обрабатывать его соответствующим образом. Использование Forms.Timer позволяет избежать использования потоков.
Поскольку DataGridViewCells не имеют событий OnValueChanged, мы переопределяем Paint, чтобы проверить, изменилось ли значение. Если это так, мы меняем BackColor и запускаем таймер, чтобы вернуть BackColor в его предыдущее значение.
Как вы можете видеть, я получил из DataGridViewTextBoxCell. Но переопределение DataGridViewCheckBoxCell или любого другого должно в основном работать одинаково.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridViewCustomControls
{
internal class DataGridViewHighlightChangeCell : DataGridViewTextBoxCell
{
public Color HighlightColor { get; set; } = Color.Red;
public int HighlightTime { get; set; } = 1000;
private object PreviousValue;
private Color PreviousColor;
private Timer HighlightTimer = new Timer();
public DataGridViewHighlightChangeCell()
{
HighlightTimer.Tick += HighlightTimer_Tick;
}
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)
{
HighlightOnChange();
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}
private void HighlightOnChange()
{
if (RowIndex == -1 || Value == PreviousValue)
{
return;
}
PreviousValue = Value;
if (HighlightTimer.Enabled)
{
HighlightTimer.Stop();
HighlightTimer.Start();
return;
}
PreviousColor = Style.BackColor;
Style.BackColor = HighlightColor;
HighlightTimer.Interval = HighlightTime;
HighlightTimer.Start();
}
private void HighlightTimer_Tick(object sender, EventArgs e)
{
HighlightTimer.Stop();
Style.BackColor = PreviousColor;
}
protected override void Dispose(bool disposing)
{
if (disposing && HighlightTimer != null)
{
HighlightTimer.Dispose();
HighlightTimer = null;
}
base.Dispose(disposing);
}
}
}
Добро пожаловать в SO. Можете ли вы опубликовать код yoyr в вопросе, чтобы мы могли видеть, что вы пробовали до сих пор? –
Я думаю, вы должны создать свой собственный класс DataGridViewCell, который имеет System.Windows.Form.Timer и обрабатывает изменения на его значение. Когда значение изменяется, сбросьте таймер и измените цвет фона. Таймер должен менять цвет при запуске. У вас нет времени для разработки правильного решения. Надеюсь, это поможет в любом случае. – sbecker
Спасибо, sbecker .... попробует это. – Rajeev