Изменение цвета строки в неактивном DataGridView - PullRequest
3 голосов
/ 08 июня 2011

Каков наилучший способ изменения цвета некоторых строк в 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 , но для меня это излишне - оно срабатывает пару сотен раз за короткое время, даже когда вы наводите указатель мыши на представление данных, пока янужно сделать это только один раз.

Есть ли у вас какие-либо советы, как решить эту проблему?

С уважением,
Марцин

1 Ответ

1 голос
/ 08 июня 2011

Одной из возможностей является цвет в событии рисования сетки данных (которое срабатывает при изменении вкладки).

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...