我构建了一个WinForms应用程序,它使用DataGridView
来显示条目。基础DataSource
是ViewModel
(BindingList<T>
扩展ISynchronizeInvoke token
)。
到目前为止所有工作都有效,但有时不会显示单元格更新(例如更改的颜色)。我正在使用CellFormatting
事件来设置视图行/单元格中的颜色。
奇怪的是,它在99%的时间内工作,但在压力下(每秒更新很多次),它无法设置正确的颜色。但是,单元格值始终是正确的。是否有可能像单元格值一样绑定颜色?
private void GridViewTestCellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
var dgv = GridViewTest;
var name = dgv.Columns[e.ColumnIndex].Name;
if (_viewModel.View != null
&& _viewModel.View.Count != 0
&& _viewModel.View.Count > e.RowIndex)
{
try
{
var data = _viewModel.View[e.RowIndex];
...
if (name == "MarkerCodes")
{
if (e.Value != null)
{
if (data != null
&& data.MarkerCodesColors != null)
{
Utils.SetCellForeColor(e, data.MarkerCodesColors.ForeColor);
Utils.SetCellBackColor(e, data.MarkerCodesColors.BackColor);
}
if (e.Value.ToString() == "Middle")
{
e.Value = string.Empty;
}
e.CellStyle.Font = new Font("Arial", 8, FontStyle.Bold);
}
}
}
catch (ArgumentOutOfRangeException)
{
//_logger.AddLog(LogEntryType.Error, ae.Message);
}
catch (IndexOutOfRangeException)
{
//_logger.AddLog(LogEntryType.Error, ie.Message);
}
SetMiddleLine(e);
}
}
private void SetMiddleLine(DataGridViewCellFormattingEventArgs e)
{
var dgv = GridViewTest;
if (dgv.CurrentRow != null)
{
var cell = dgv.Rows[e.RowIndex].Cells["MarkerCodes"];
if (cell != null)
{
if (cell.Value != null &&
cell.Value.ToString() == "Middle")
{
Rectangle rec = dgv.GetCellDisplayRectangle(0, e.RowIndex, true);
Rectangle rec2 = dgv.GetCellDisplayRectangle(4, e.RowIndex, true);
// SuspendLayout();
using (Graphics gr = dgv.CreateGraphics())
{
gr.DrawLine(new Pen(Color.Black, 2), new Point(rec.X, rec.Y - 2),
new Point(rec2.X + rec2.Width, rec2.Y - 2));
// ResumeLayout(false);
}
}
}
}
}