Пользовательская роспись в DataGridView, странное визуальное отображение

0

Я работаю над приложением, которое использует datagridview для визуализации некоторых данных. Данные логически структурированы четыре-четыре. И чтобы визуализировать это, я хочу нарисовать линию/границу каждой четвертой строки в datagridview.

Я сделал это, написав следующий метод RowPostPaint (лишенный массового кода)

System::Void dataGridView1_RowPostPaint(System::Object^  sender, Forms::DataGridViewRowPostPaintEventArgs^  e) {

    A = ...

    Rectangle rowBorder  = dataGridView1->GetRowDisplayRectangle(e->RowIndex,true);

    if(A->ID % 4 == 0){
        e->Graphics->DrawLine(gcnew Pen(Drawing::Color::Black),(float)
        rowBorder.X ,(float)(rowBorder.Y + rowBorder.Height-2), (float) rowBorder.X +
        rowBorder.Width  ,(float) (rowBorder.Y + rowBorder.Height-2) );
    }
} 

По какой-то причине картина повреждена (отображается больше строк, чем должно быть, см. Рисунок), когда я использую полосу прокрутки или изменяю размер окна. Принудительное перерисовывание, например, путем выбора затронутой строки, делает ошибочную строку уходящей.

Я испробовал несколько советов (двойная буферизация, клипы и т.д.), Чтобы исправить это, но пока я еще не смог этого сделать. Как вы, наверное, поняли, я совершенно новый для графики/живописи в c++/cli. Теперь у меня нет идей, я надеюсь, что вы можете прийти с новыми

Изображение 174551

Теги:
command-line-interface
datagridview
repaint

1 ответ

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню