Событие рисования DataGridView не рисует границы ячейки при прокрутке снизу вверх - PullRequest
0 голосов
/ 12 февраля 2020

Используя C# WinForms, в моей форме закреплен (заполнен) стандартный элемент управления DataGridView. Столбцы и строки DataGridView создаются один раз, программно, когда загружается форма. Я рисую некоторые заголовки и границы ячеек в событии Paint. Все хорошо.

У меня проблема с прокруткой. Когда я прокручиваю вниз, все рисует нормально. Однако, когда я прокручиваю назад, некоторые границы не отображаются. Когда на экране отображается неокрашенная область, и я снова прокручиваю ее вниз, сохраняя при этом неокрашенную область на экране, она перерисовывается нормально. Я пытаюсь увидеть что-то странное при отладке, потому что это происходит совершенно случайно; один ряд не мог быть нарисован сейчас, а в следующий раз это могла быть другая граница. «Я знаю, что это хорошо рисует», потому что, когда я прокручиваю вниз до самого дна, все вниз, все окрашивается так, как должно. Только когда я прокручиваю назад вверх, случайные строки не закрашиваются, и каждый раз это могут быть разные строки.

Как вы увидите из кода ниже, я устанавливаю границы, которые мне не нужны окрашены в прозрачный. Даже если я установлю для неокрашенных границ значение 0 и установлю стиль границ в none, это даст тот же результат.

Это ошибка GUI или ошибка refre sh или что?

В соответствии с примером, я прокрутил весь путь вниз, и когда я спустился вниз, я увидел, что все границы нарисованы нормально. Я могу повторить его снова и снова с тем же результатом, как показано ниже.

grid_01

Затем, когда я прокручиваю назад вверх, некоторые границы не закрашиваются случайным образом , как вы можете видеть на линии сетки с текстом 20:00; строка «20:00» должна выглядеть так же, как строка «21:00», как показано ниже.

grid_02

Код, которым я являюсь использовать для рисования это:

    /// <summary>data grid view cell painting event : to draw custom cell borders</summary>
    private void dgv_cell_painting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        try
        {
            int row = e.RowIndex;

            int column = e.ColumnIndex;

            int last_col = data_grid_appointments.ColumnCount - 1;

            int last_row = data_grid_appointments.RowCount - 1;

            string row_tag = ((DataGridView)sender).Rows[row].Tag.ToString();

            bool is_hour = (string.IsNullOrEmpty(row_tag) ? false : row_tag.EndsWith("00"));

            switch (row < last_row)
            {
                case true:  //not the last row

                    switch (row == 0
                            ||
                            is_hour)
                    {
                        case true:  //first row or row is on the hour

                            switch (column == -1)
                            {
                                case true:

                                    e.PaintBackground(e.CellBounds, true);
                                    e.PaintContent(e.CellBounds);

                                    ControlPaint.DrawBorder
                                    (
                                          e.Graphics
                                        , e.CellBounds
                                        , Color.Transparent, 1, ButtonBorderStyle.Solid
                                        , Color.Orange, 1, ButtonBorderStyle.Solid
                                        , Color.Orange, 1, ButtonBorderStyle.Solid
                                        , Color.Transparent, 1, ButtonBorderStyle.Solid
                                    );

                                    e.Graphics.DrawString
                                    (
                                          row_tag.Substring(0, 2) + ":" + row_tag.Substring(2)
                                        , e.CellStyle.Font
                                        , new SolidBrush(Color.Black)
                                        , e.CellBounds
                                        , new StringFormat()
                                            {
                                                Alignment = StringAlignment.Center
                                                    ,
                                                FormatFlags = StringFormatFlags.NoWrap
                                                    ,
                                                LineAlignment = StringAlignment.Center
                                            }
                                    );

                                    e.Handled = true;

                                    break;

                                default:

                                    switch (column == data_grid_appointments.ColumnCount - 1)
                                    {
                                        case true:

                                            e.PaintBackground(e.CellBounds, true);
                                            e.PaintContent(e.CellBounds);

                                            ControlPaint.DrawBorder
                                            (
                                                  e.Graphics
                                                , e.CellBounds
                                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                                , Color.Orange, 1, ButtonBorderStyle.Solid
                                                , Color.Orange, 1, ButtonBorderStyle.Solid
                                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                            );

                                            e.Handled = true;

                                            break;

                                        default:

                                            e.PaintBackground(e.CellBounds, true);
                                            e.PaintContent(e.CellBounds);

                                            ControlPaint.DrawBorder
                                            (
                                                  e.Graphics
                                                , e.CellBounds
                                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                                , Color.Orange, 1, ButtonBorderStyle.Solid
                                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                            );

                                            e.Handled = true;

                                            break;
                                    }

                                    break;
                            }

                            break;

                        default:    //not the first column

                            if (column == -1
                                ||
                                column == data_grid_appointments.ColumnCount - 1)
                            {
                                e.PaintBackground(e.CellBounds, true);
                                e.PaintContent(e.CellBounds);

                                ControlPaint.DrawBorder
                                (
                                      e.Graphics
                                    , e.CellBounds
                                    , Color.Transparent, 1, ButtonBorderStyle.Solid
                                    , Color.Transparent, 1, ButtonBorderStyle.Solid
                                    , Color.Orange, 1, ButtonBorderStyle.Solid
                                    , Color.Transparent, 1, ButtonBorderStyle.Solid
                                );

                                e.Handled = true;
                            }

                            break;
                    }

                    break;

                default:    //last row

                    switch (column == -1
                            ||
                            column == last_col)
                    {
                        case true:    //row header column OR very last column in the very last row

                            e.PaintBackground(e.CellBounds, true);
                            e.PaintContent(e.CellBounds);

                            ControlPaint.DrawBorder
                            (
                                  e.Graphics
                                , e.CellBounds
                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                , Color.Orange, 1, ButtonBorderStyle.Solid
                                , Color.Orange, 1, ButtonBorderStyle.Solid
                            );

                            e.Handled = true;

                            break;

                        default:    //not the header column

                            e.PaintBackground(e.CellBounds, true);
                            e.PaintContent(e.CellBounds);

                            ControlPaint.DrawBorder
                            (
                                  e.Graphics
                                , e.CellBounds
                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                , Color.Transparent, 1, ButtonBorderStyle.Solid
                                , Color.Orange, 1, ButtonBorderStyle.Solid
                            );

                            e.Handled = true;

                            break;
                    }

                    break;
            }
        }

        catch (Exception ex)
        {}
    }

1 Ответ

0 голосов
/ 17 февраля 2020

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

private void data_grid_appointments_scroll(object sender, ScrollEventArgs e)
{
    ((DataGridView)sender).Invalidate();   
}
...