Производная задача рисования 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 ();

Ответы на вопрос(4)

Ваш ответ на вопрос