【问题标题】:Colour not being applied to datagridview row unless it has focus除非有焦点,否则颜色不会应用于 datagridview 行
【发布时间】:2010-12-22 09:19:40
【问题描述】:

我正在创建一个日志表单并在 DGV 中显示信息。 每个日志都以 LogEntry 类的形式出现。

最初我像这样创建并向 DGV 添加数据:

像这样创建 DGV 的每一列:

DataGridViewTextBoxColumn dateTimeColumn = new DataGridViewTextBoxColumn();
dateTimeColumn.Name = "dateTime";
dateTimeColumn.HeaderText = "Date/Time";
dataGridView_Log.Columns.Add(dateTimeColumn);

添加logEntry记录:

dataGridView_Log.Rows.Add(logEntry.dateTime, logEntry.service, logEntry.command, logEntry.message);
dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color;

这一切都很好,每一行都涂上了正确的颜色,但是作为一个日志,它包含很多条目,所以我希望能够随意过滤它。

环顾四周后,我似乎无法使用我拥有的方法进行过滤(也许我只是没有找到正确的示例?)所以我恢复了这种方法:

添加列:

    //Create a new DataTable
    dt = new DataTable("Logs");

    //Add columns to datatable
    dt.Columns.Add("dateTime", typeof(string));
    dt.Columns.Add("Service", typeof(string));
    dt.Columns.Add("Command", typeof(string));
    dt.Columns.Add("Message", typeof(string));

    //Set the dataGridView's dataSoure to the filled dataTable
    dataGridView_Log.DataSource = dt;

添加行:

  row = dt.NewRow();

  row["dateTime"] = logEntry.dateTime;
  row["Service"] = logEntry.service;
  row["Command"] = logEntry.command;
  row["Message"] = logEntry.message;

  dt.Rows.Add(row);

   dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color;

但问题是,如果 DGV 没有焦点,则颜色不会应用于任何行,它们只是黑色文本。但是一旦 DGV 获得焦点,所有后续添加的行都会被着色。

另一个注释一旦被过滤,我希望颜色仍然应用于正确的行。

我想要的只是闪亮的颜色:)

感谢您的时间和帮助。

【问题讨论】:

    标签: c# datagridview colors row


    【解决方案1】:

    我遇到了类似的问题。

    我的 DataGridView 数据源是一个对象列表,其中许多对象可以在“块”属性中具有相同的值。我尝试根据“块”应用颜色。

    我通过使用包含属性每个值的颜色的列表解决了这个问题:

    保存颜色的属性:

    private Dictionary<Block, Color> m_BlockColors = new Dictionary<Block, Color>();
    

    代码:

    DataGridViewCell blockCell = null;
    if (dataGridView.Columns.Contains(columnNameBlock))
    {
        blockCell = dataGridView[columnNameBlock, e.RowIndex];
    }
    if (blockCell != null)
    {
        if (blockCell.Value == null)
        {
            e.CellStyle.BackColor = Color.Red;
        }
        else
        {
            Block blockOfCurrentRow = (Block)blockCell.Value;
            Block blockOfRowBefore = null;
    
            // Wont hit at first Row!
            if (e.RowIndex > 0)
            {
                blockOfRowBefore = (Block)dataGridView[columnNameBlock, e.RowIndex - 1].Value;
            }
    
            if (blockOfRowBefore != null)
            {
                //Trace.WriteLine("------------------------------------------------------");
                //Trace.WriteLine(String.Format("RowIndex: {0}", e.RowIndex));
                //Trace.WriteLine(String.Format("ColumnIndex: {0}", e.ColumnIndex));
                //Trace.WriteLine(String.Format("Current Block: {0}", blockOfCurrentRow.BlockNummer));
                //Trace.WriteLine(String.Format("Prev Block: {0}", blockOfRowBefore.BlockNummer));
    
                if (blockOfCurrentRow == blockOfRowBefore)
                {
                    e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
                }
                else
                {
                    // Previous Row was gray:
                    if (m_BlockColors[blockOfRowBefore] == Color.LightGray)
                    {
                        if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
                        {
                            m_BlockColors.Add(blockOfCurrentRow, Color.White);
                        }
                    }
                    // Previous Row was white:
                    else
                    {
                        if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
                        {
                            m_BlockColors.Add(blockOfCurrentRow, Color.LightGray);
                        }
                    }
                    e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
                }
            }
            else
            {
                // first Row
                if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
                {
                    m_BlockColors.Add(blockOfCurrentRow, Color.White);
                }
                e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不确定为什么在您选择网格中的某些内容之前颜色不会刷新。设置完颜色后有没有尝试调用.Refresh().Update()

      有关DataGridView 样式的有趣读物位于 MSDN 中的此链接:

      http://msdn.microsoft.com/en-us/library/1yef90x0.aspx

      【讨论】:

      • 对不起,当我说获得焦点时,我的意思是 DGV 可以“看到”。 DGV 位于一个单独的表单上,该表单首先被实例化,然后当用户单击显示的按钮时,关闭的表单甚至被覆盖,并且它被隐藏而不是关闭。只有当表单是第一个 form.show() 时才会应用颜色。
      【解决方案3】:

      我想我已经解决了...

      我添加了(创建数据表时):

      dt.Columns.Add("Color", typeof(Color));
      

      然后在分配数据源之后

      dataGridView_Log.Columns["Color"].Visible = false;
      

      填充每一行:

      row["Color"] = logEntry.color;
      

      添加了单元格格式化事件:

          private void dataGridView_Log_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
          {
              dataGridView_Log.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (Color)dataGridView_Log.Rows[e.RowIndex].Cells["Color"].Value;
          }
      

      也适用于过滤:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2017-11-30
        • 1970-01-01
        • 2010-12-04
        • 2014-04-17
        相关资源
        最近更新 更多