未激活的DataGridView中更改行颜色

3

当DataGridView处于非活动状态时,改变某些行的背景颜色有什么最好的方法?

在“真实”的世界中,我想在按钮单击后使用它来格式化所有DataGridView行,具体取决于一些条件。

要重现此行为,请尝试:
1.在WinForms应用程序中放置带有两个选项卡页面的TabControl。在第一个选项卡上放置按钮,在第二个选项卡上放置DataGridView。
2.使用以下代码:

using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public int counter = 0;

        public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();

            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Surname", typeof(string));
            dt.Rows.Add("Mark", "Spencer");
            dt.Rows.Add("Mike", "Burke");
            dt.Rows.Add("Louis", "Amstrong");

            dataGridView1.DataSource = dt;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            counter++;
            this.Text = "Event counter: " + counter.ToString();

            dataGridView1.Rows[1].DefaultCellStyle.BackColor = System.Drawing.Color.Red;
        }
    }
}

我将计数器变量放在那里来测试不同选项,以查看更改颜色事件被触发的次数(次数越少越好;) - 理想情况下只触发一次)。

现在,如果您首先点击按钮而不进入tabPage2,然后切换到tabPage2,则行的颜色不会更改。这是我的问题。

当您首先激活tabPage2,然后按下按钮或在程序上设置tabControl1.SelectedIndex = 1;,然后着色行,然后切换回tabControl1.SelectedIndex = 0;时,它将起作用 - 但在这种情况下,它会“闪烁”。

我还尝试将更改颜色的代码放在cell_painting事件中,但对我来说太过复杂 - 即使您在datagridview上移动鼠标,它也会在短时间内触发几百次,而我只需要执行一次。

您有什么建议来解决这个问题吗?

最好的问候,
Marcin


@V4Vendetta:作为最后的解决方案-是的,但它会被触发很多次,对我来说浪费了CPU时间 ;) - mj82
1个回答

1
一种可能性是在DataGridView的绘制事件中更改颜色(当选项卡页发生变化时会触发该事件)。
private void dataGridView1_Paint(object sender, PaintEventArgs e)
{
    dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.Red;
}

这对我来说很好用 - 当您更改选项卡时,绘制事件确实会被调用多次,因此如果您只想设置 DefaultCellStyle 一次,可以尝试以下操作:

public partial class Form1 : Form
{

    private bool setcol;
    private bool painted;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        setcol = true;
        painted = false;
    }

    private void dataGridView1_Paint(object sender, PaintEventArgs e)
    {
        if (setcol && !painted)
        {
            painted = true;
            dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.Red;
        }
    }
}

@mj82 整理这个的一种方法是子类化 datagridview 控件,然后将此逻辑放在那里(也许还可以设置一个新属性来设置背景颜色)。 - David Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接