Используя C# WinForms, в моей форме закреплен (заполнен) стандартный элемент управления DataGridView. Столбцы и строки DataGridView создаются один раз, программно, когда загружается форма. Я рисую некоторые заголовки и границы ячеек в событии Paint. Все хорошо.
У меня проблема с прокруткой. Когда я прокручиваю вниз, все рисует нормально. Однако, когда я прокручиваю назад, некоторые границы не отображаются. Когда на экране отображается неокрашенная область, и я снова прокручиваю ее вниз, сохраняя при этом неокрашенную область на экране, она перерисовывается нормально. Я пытаюсь увидеть что-то странное при отладке, потому что это происходит совершенно случайно; один ряд не мог быть нарисован сейчас, а в следующий раз это могла быть другая граница. «Я знаю, что это хорошо рисует», потому что, когда я прокручиваю вниз до самого дна, все вниз, все окрашивается так, как должно. Только когда я прокручиваю назад вверх, случайные строки не закрашиваются, и каждый раз это могут быть разные строки.
Как вы увидите из кода ниже, я устанавливаю границы, которые мне не нужны окрашены в прозрачный. Даже если я установлю для неокрашенных границ значение 0 и установлю стиль границ в none, это даст тот же результат.
Это ошибка GUI или ошибка refre sh или что?
В соответствии с примером, я прокрутил весь путь вниз, и когда я спустился вниз, я увидел, что все границы нарисованы нормально. Я могу повторить его снова и снова с тем же результатом, как показано ниже.
Затем, когда я прокручиваю назад вверх, некоторые границы не закрашиваются случайным образом , как вы можете видеть на линии сетки с текстом 20:00; строка «20:00» должна выглядеть так же, как строка «21:00», как показано ниже.
Код, которым я являюсь использовать для рисования это:
/// <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)
{}
}