Dziękuję za udzielone rady, uwzględniając je udało mi się osiągnąć zamierzony efekt w poniższy sposób.
Stan kiedy komórka ma zmieniony kolor trwa 1 sek i działa to świetnie. Zauważyłem jednak że użycie procesora wzrosło do 30% (wczesniej użycie było marginalne). Zapewne ma to związek z odmalowywaniem komórek, a jest ich trochę (kilka zmian na sekunde). Czy da się ten problem też jakoś rozwiązać ?
mdCollection.ListChanged += new ListChangedEventHandler(mdCollection_ListChanged);
tc = new TimerCallback(CellColorChange);
cellTimer = new System.Threading.Timer(tc, cellColors, 10, 10) // odświeżanie co 10 ms.
private void mdCollection_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemChanged)
{
try
{
int rowIndex = e.NewIndex;
string cellName = e.PropertyDescriptor.Name;
int colIndex = monitor.Rows[rowIndex].Cells[cellName].ColumnIndex;
monitor.Rows[rowIndex].Cells[cellName].Style.BackColor = Color.FromArgb(208, 248, 136);
cellColors.Add(new CellColor(Environment.TickCount, rowIndex, colIndex));
}
catch (Exception ex) { }
}
}
private void CellColorChange(Object obj)
{
if (obj is List<CellColor>)
{
try
{
List<CellColor> cellColors = (List<CellColor>)obj;
int count = cellColors.Count;
int currentTime = Environment.TickCount;
foreach (CellColor ck in cellColors)
{
if (currentTime - ck.Time > 1000)
{
monitor.Rows[ck.RowIndex].Cells[ck.ColIndex].Style.BackColor = Color.White; // monitor = DataGridView
cellColors.Remove(ck);
}
}
}
catch (Exception ex)
{
}
}
}