2009-08-19 3 views
4

Late Edit Я отметил это как вопрос на C#, а также C++, потому что проблема возникает на обоих языках, а решение , если показано, что, скорее всего, будет в C# (большая часть рынка).Исходная задача рисования DataGridView. Показывает черные области

Я разрабатываю приложение под .net 2.0 (C++, чтобы быть конкретным, но неактуальным).

Это приложение использует настраиваемое производное datagridview. Этот datagridview будет иногда иметь проблемы с артефактами в отношении области DGV, которая не содержит ячеек, а также полосу прокрутки. Во время некоторых действий по изменению размера черный прямоугольник будет рисовать нижнюю часть datagridview, что фактически ограничит размер сетки. Полоса прокрутки также становится сжатой, чтобы поместиться внутри необрезанной области. Мне кажется, что система полагает, что DGV - неправильный размер, и втягивается в неправильный регион.

alt text http://img12.imageshack.us/img12/2213/81356991.jpg

Есть только два способа я могу найти, чтобы исправить симптомы:
1. При нажатии на столбец, чтобы изменить размер будет автоматически фиксировать сетку
2. Вызов AutoResizeRows() функции в DGV будет сделайте исправление (но я верю, это то, что вызывается из пункта 1).

Некоторые изменения в пользовательской DGV:
1) Конфигурируется для обработки перетаскивания \ drop из нескольких строк.
2) Точка 1 требуется OnCellPainting для переопределения для рисования линий перетаскивания. Функция может быть опубликована, если она кажется симптоматичной.
3) Проблемы всегда возникают при изменении размера (как вручную, так и автоматически могут возникнуть проблемы), но в событии изменения размера нет специального кода.

поздняя редакция код для onCellPainting. Другие функции переопределены в GridView: 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 исправляет ее. Это очень медленно и нежелательно.

Обновить(); UpdateBounds(); Обновить(); Invalidate(); PerformLayout(); ResetBackColor(); ResetBindings(); ResetForeColor(); ResetText(); UpdateStyles();

+0

Tagged C#, но автор утверждает VC++ - может ли кто-нибудь с достаточным количеством rep retag, пожалуйста? –

+0

Можете ли вы опубликовать код OnCellPainting? Это, безусловно, похоже на кандидата. Если вы просто закомментируете это переопределение, вы все еще видите эту проблему при изменении размера? – MusiGenesis

+0

Оригинальный пост с OnCellPainting. Комментируя переопределенную функцию, все равно не повезло. – greggorob64

ответ

7

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

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

+1

Я буду будь это проклято, это сделало мой цикл UpdateData, называемый suspendlayout в начале цикла, и имел пару условных выражений, где он выходил из цикла, и никогда не вызывать resumelayout. С SuspendLayout bieng stackable он быстро нарушил макет. в конце finally() в конце моего цикла обновления исправлено это! – greggorob64

+0

Awesome ... Я вышел на конечность и догадался об этом. Рад, что я могу помочь. – espais

+0

Следите за исключениями, предотвращающими ResumeLayout() от того, чтобы быть вызванным ... try-finally поможет! –

0

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

MSDN От:

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

+0

У меня есть DoubleBuffered и ResizeRedraw оба установлены в true, безрезультатно. – greggorob64

0

Try очистка графики с фоном сетке в OnPaint:

Graphics g = e.Graphics; 
g.Clear(this.BackColor); 
+0

Приятная попытка, но не игра в кости :(Однако вы меня поняли в новом процессе мышления. Проблема в том, что datagridview * я думаю *, что клиентская область datagridview считает, что она находится в неправильном месте. – greggorob64

0

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

Смежные вопросы