Производная задача рисования DataGridView. Показывает черные регионы - PullRequest
4 голосов
/ 19 августа 2009

Позднее редактирование Я отметил это как вопрос 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 <= this->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 ]

7 голосов
/ 11 сентября 2009

Мне кажется, что ваш элемент управления неправильно отображает свой макет.
Вы приостановили компоновку в какой-то момент в своем коде, а затем никогда не возобновили макет?

Это позволит вашему элементу управления функционировать должным образом, но не будет правильно расставлять все его компоненты.

0 голосов
/ 28 сентября 2016

У меня была та же проблема, вызванная тем, что некоторые resx файлы не загружались, на которые ссылались из события mDataGridView_CellPainting. Размер DataGridView также стал очень медленным.

0 голосов
/ 10 сентября 2009

Попробуйте очистить графику с фоном сетки в OnPaint:

Graphics g = e.Graphics;
g.Clear(this.BackColor);
0 голосов
/ 21 августа 2009

Попробуйте установить для свойства .ResizeRedraw вашего элемента управления значение true в конструкторе, посмотрите, поможет ли это.

С MSDN :

Получает или задает значение, указывающее, перерисовывается ли элемент управления при изменении размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...