在非活动DataGridView中更改行颜色

时间:2011-06-08 10:52:39

标签: c# datagridview

它不活动

,在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上,它也会在短时间内被激发几百次,而我需要只做一次。

您对如何解决该问题有任何建议吗?

最好的问候,
马尔钦

1 个答案:

答案 0 :(得分:1)

一种可能性是datagridview paint事件中的颜色(当tabpage更改时会触发)。

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

这对我很有用 - 当您更改选项卡时,paint事件会多次被调用,因此如果您只想设置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;
        }
    }
}