DataGridView单元格颜色不变

时间:2013-01-09 12:45:56

标签: datagridview cell cell-formatting

我构建了一个WinForms应用程序,它使用DataGridView来显示条目。基础DataSourceViewModelBindingList<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);
                    }
                }
            }
        }
    }

0 个答案:

没有答案