Как вы выделяете метки строк и / или столбцов для сетки данных при наведении курсора на любую ячейку (в c #)? - PullRequest
2 голосов
/ 03 июня 2009

При использовании элемента управления DataGridView в форме Windows при наведении указателя мыши на метку строки (или метку столбца) фон (ячейка метки) меняется на синий (или другой цвет в зависимости от цветовой схемы Windows) сомнения).

Я хотел бы создать этот эффект при наведении мыши на любую ячейку в сетке - то есть выделите метку строки для строки, над которой в данный момент находится мышь.

Логика для изменения стиля текущей строки достаточно проста, используя событие mouseover. Я могу изменить другие атрибуты строки (например, задний цвет), но мне бы очень хотелось что-то более тонкое, и я думаю, что выделение метки строки будет очень эффективным.

Можно ли это сделать - если да, то как? (Предпочтительно C #)

Ответы [ 3 ]

9 голосов
/ 21 июня 2009

Вы можете переопределить событие OnCellPainting , чтобы сделать то, что вы хотите. В зависимости от размера вашего DataGridView вы можете увидеть мерцание, но это должно делать то, что вы хотите.


    class MyDataGridView : DataGridView
    {
        private int mMousedOverColumnIndex = int.MinValue;
        private int mMousedOverRowIndex = int.MinValue;

        protected override void OnCellMouseEnter(DataGridViewCellEventArgs e)
        {
            mMousedOverColumnIndex = e.ColumnIndex;
            mMousedOverRowIndex = e.RowIndex;
            base.OnCellMouseEnter(e);
            base.Refresh();
        }

        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
        {
            if (((e.ColumnIndex == mMousedOverColumnIndex) && (e.RowIndex == -1)) ||
                ((e.ColumnIndex == -1) && (e.RowIndex == mMousedOverRowIndex)))
            {
                PaintColumnHeader(e, System.Drawing.Color.Red);
            }
            base.OnCellPainting(e);
        }

        private void PaintColumnHeader(System.Windows.Forms.DataGridViewCellPaintingEventArgs e, System.Drawing.Color color)
        {
            LinearGradientBrush backBrush = new LinearGradientBrush(new System.Drawing.Point(0, 0), new System.Drawing.Point(100, 100), color, color);
            e.Graphics.FillRectangle(backBrush, e.CellBounds);
            DataGridViewPaintParts parts = (DataGridViewPaintParts.All & ~DataGridViewPaintParts.Background);
            e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;
            e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;
            e.Paint(e.ClipBounds, parts);
            e.Handled = true;
        }
    }
2 голосов
/ 03 июня 2009

Вы можете подключиться к событиям CellMouseEnter и CellMouseLeave объекта DataGridView, а затем соответствующим образом изменить фоновый цвет. Примерно так:

    private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers
        {
            return;
        } 

        this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.LightBlue;
    }

    private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers
        {
            return;
        }

        this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.White;
    }
1 голос
/ 29 января 2017

Я знаю, что у вас уже есть ответ на этот вопрос, но я поделюсь чем-то другим.

Таким образом, весь ряд окрашен . Я просто немного изменил комментарии @BFree.

        private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers
        {
            return;
        }
        foreach (DataGridViewCell cell in this.dataGridView1.Rows[e.RowIndex].Cells)
        {
           cell.Style.BackColor = Color.LightBlue;
        }
    }

    private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex < 0) //column header / row headers
        {
            return;
        }
        foreach (DataGridViewCell cell in this.dataGridView1.Rows[e.RowIndex].Cells)
        {
            cell.Style.BackColor = Color.White;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...