【问题标题】:DataGridView row's background color is not changingDataGridView 行背景颜色没有改变
【发布时间】:2012-03-20 15:23:39
【问题描述】:

我想根据加载时的特定条件更改 DGV 行的背景颜色,即使在 Windows 窗体中也是如此。但我看不到任何 DGV 行的颜色变化。谁能告诉我如何解决这个问题?

private void frmSecondaryPumps_Load(object sender, EventArgs e)
{
            try
            {
                DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper());
                dataGridView1.DataSource = dt;

                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    foreach (DataGridViewColumn column in dataGridView1.Columns)
                    {
                        if (row.Cells[column.Name] != null)
                        {
                            if (row.Cells[column.Name].Value.ToString() == "ON")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Green;

                            if (row.Cells[column.Name].Value.ToString() == "OFF")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                        }
                    }
                }

                dataGridView1.Refresh();
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

【问题讨论】:

  • 为什么不设置BackColor 而不是ForeColor
  • 我也试过了,但是在 DGV 的任何一行中我都看不到行颜色有任何变化

标签: c# .net winforms datagridview


【解决方案1】:

我认为最好的地方是在DataGridViewCellFormatting 事件中设置BackColor,就在这些行中。

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index
    // check the cell value under your specific column and then you can toggle your colors
    row.DefaultCellStyle.BackColor = Color.Green;
}

【讨论】:

  • 正如 King_Rob 在下面所说的,即使在滚动时,Cellformatting 也会持续触发事件。谨慎使用。
  • 该事件多次触发。
【解决方案2】:

使用cellformattingdatabindingcomplete 甚至paint 事件的一个问题是它们会被多次触发。从我收集到的信息来看,datagridview 控件存在一个问题,即在显示表单之前,您无法更改任何单元格的颜色。因此,在调用Shown() 之前运行的方法或触发的事件不会改变颜色。定位为问题解决方案的事件通常有效,但由于它们被多次调用,可能不是最有效的答案。

可能最简单的问题解决方案是将您的代码用于填充/着色您的网格在表单的Shown() 方法而不是构造函数中。下面是 msdn 论坛中向我提示解决方案的帖子的链接,它被标记为页面下方 3/4 处的答案。

MSDN forums post with the Solution

【讨论】:

  • 这应该是正确的答案。并且只是添加实现细节:使用 Load 事件设置标志,然后使用 Visible 事件设置背景色。
  • 这是正确的答案。提高了性能,因为它不会像使用单元格格式化和其他处理程序时那样多次触发
【解决方案3】:

很抱歉回答晚了,但我现在正面临完全相同的问题。

对于在构造函数中不能正常工作的事情,我有一些通用的解决方案 - 使用计时器

将其设置为较短的时间,例如 100 毫秒。然后在构造函数中你将拥有

timer1.Enabled=true

在 timer_Tick 事件中:

timer1.Enabled=false

and all the code that doesn't work in constructor goes here...

每次都对我有用。

【讨论】:

    【解决方案4】:

    King_Rob 是正确的。我遇到了同样的问题,所以我只发布我的实现,因为这里的其他建议远非最佳。

    添加事件处理程序(在设计器或构造器中):

    this.Load += UserControl_Load; // or form or any control that is parent of the datagridview
    dataGridView1.VisibleChanged += DataGridView1_VisibleChanged;
    

    在加载事件处理方法中添加一个标志

    private bool _firstLoaded;
    private void UserControl_Load(object sender, EventArgs e)
    {
        _firstLoaded = true;
    }
    

    最后在可见事件处理方法中:

    private void DataGridView1_VisibleChanged(object sender, EventArgs e)
    {
        if (_firstLoaded && dataGridView1.Visible)
        {
            _firstLoaded = false;
            // your code
        }
    }
    

    【讨论】:

    • 最简单的答案!谢谢!
    【解决方案5】:

    此代码快速、简单且不占用内存!

    例如,在 CellEndEdit 事件中使用此代码

     `try{
     //your code
     }
     catch(Exception){
     //your exception
     }
    finally{
    yourDataGridView.Visible = false;
     yourDataGridView.Visible = true;
    }
    

    `

    【讨论】:

    • 这对用户有什么帮助?
    • 也许它与其他 Microsoft 产品相同,关闭并重新启动 (Visible = false; Visible = true) 确实有帮助?
    • 如果它有效(并且它对我有效),这意味着它有帮助。你同意我的观点吗?
    【解决方案6】:

    使用以下代码更改 Datagrid 项的颜色

    Datagrid1.SelectedIndex = e.Item.ItemIndex;
    Datagrid1.Items[e.Item.ItemIndex].Cells[0].BackColor = System.Drawing.Color.Green;
    

    【讨论】:

      【解决方案7】:

      主要问题是当您运行此代码时。您使用触发器_Load 运行它,这就是它不着色的原因,当您在表单上使用触发器_Shown 运行相同的代码时,着色将起作用。加载表单时会触发加载,因此仍然可能有一些幕后代码在您的代码之后运行。显示的触发器在一切完成并且表单完全加载后运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        相关资源
        最近更新 更多