Производная задача рисования DataGridView. Показывает черные регионы
Позднее редактирование Я пометил это как вопрос C #, а также C ++, потому что проблема представлена на обоих языках, и решениеесли показанный, скорее всего, будет в C # (большинство рынка).
Я разрабатывал приложение под .net 2.0 (C ++, чтобы быть конкретным, но не имеет значения).
Это приложение использует пользовательское производное представление данных. Это сетевое представление иногда будет иметь серьезные проблемы с артефактами, касающиеся области DGV, которая не содержит ячеек, а также полосы прокрутки.Во время некоторых действий по изменению размера, черный прямоугольник будет рисоваться в нижней части сетки данных, что фактически ограничит размер сетки. Полоса прокрутки также укорачивается, чтобы уместиться внутри несокращенной области. Мне кажется, поскольку система считает, что DGV имеет неправильный размер и втягивается в неправильный регион.
альтернативный текст http://img12.imageshack.us/img12/2213/81356991.jpg
Есть только два способа исправить симптомы:
1. Нажав на столбец для изменения размера, вы автоматически исправите сетку.
2. Вызов функции AutoResizeRows () в DGV сделает исправление (но я считаю, что это то, что вызывается из пункта 1).
Некоторые из модификаций Custom DGV:
1) Настроен для обработки перетаскивания нескольких строк.
2) Точка 1 требует переопределения OnCellPainting для рисования линий перетаскивания. Функция может быть опубликована, если она кажется симптоматической.
3) Проблемы всегда возникают при изменении размера (как ручное, так и автоматическое может вызвать проблему), но в событии изменения размера нет специального кода.
позднее редактирование код для onCellPainting. Другие функции, переопределенные в виде сетки: OnMouseDown, OnCellMouseDown, OnClick, OnMouseMove, OnDragOver, OnDragDrop, OnDragLeave, OnKeyDown, ни одна из которых не является симптоматической
protected: [DebuggerStepThrough()]
virtual System::Void OnCellPainting(DataGridViewCellPaintingEventArgs ^e) override
{
//draws red drag/drop target indicator lines if necessary
if (this->AllowDrop && _DragDropCurrentIndex > -1 && ShowDragLines)
{
System::Drawing::Pen ^p = gcnew Pen(System::Drawing::Color::Navy, 3);
//row drag/drop
if (e->RowIndex == _DragDropCurrentIndex &&
_DragDropCurrentIndex RowCount)
{
//if this cell is in the same row as the mouse cursor
e->Graphics->DrawLine(
p,
e->CellBounds.Left,
e->CellBounds.Top - 1,
e->CellBounds.Right,
e->CellBounds.Top - 1);
} //end if
if(e->RowIndex == this->Rows->Count - 1 &&
_DragDropCurrentIndex == Int32::MaxValue)
{
e->Graphics->DrawLine(
p,
e->CellBounds.Left,
e->CellBounds.Bottom + 1,
e->CellBounds.Right,
e->CellBounds.Bottom + 1);
}
} //end if
DataGridView::OnCellPainting(e);
} //end OnCellPainting
* Больше правок Ничто из этого не помогает устранить проблему, единственное, что устраняет ее ПОСЛЕ возникновения проблемы, - это AutoResizeRows (AllCells) // Только ее исправляет только AllCells. Это'очень медленно и нежелательно.
Refresh (); UpdateBounds (); Обновить(); Invalidate (); PerformLayout (); ResetBackColor (); ResetBindings (); ResetForeColor (); ResetText (); UpdateStyles ();