Pochodny problem z rysowaniem DataGridView. Pokazuje czarne regiony

Późna edycja Oznaczyłem to jako pytanie C #, a także C ++, ponieważ problem występuje w obu językach i rozwiązaniuJeśli pokazany najprawdopodobniej będzie w C # (większość rynku).

Tworzyłem aplikację pod .net 2.0 (C ++ jest specyficzna, ale nieistotna).

Ta aplikacja używa niestandardowego pochodnego widoku datagridview. Ten datagridview może czasami powodować problemy z artefaktami serwera w obszarze DGV, który nie zawiera komórek, a także pasek przewijania.Podczas niektórych operacji zmiany rozmiaru czarny prostokąt zostanie narysowany w dolnej części widoku datagridview, co w efekcie ograniczy rozmiar siatki. Pasek przewijania również ulega zmniejszeniu, aby zmieścił się w obszarze nie zajętym. Wydaje mi się, że system uważa, że ​​DGV ma niewłaściwy rozmiar i przyciąga niewłaściwy region.

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

Są tylko dwa sposoby na znalezienie symptomów:
1. Kliknięcie kolumny w celu zmiany rozmiaru spowoduje automatyczne ustawienie siatki
2. Wywołanie funkcji AutoResizeRows () w DGV spowoduje naprawę (ale wierzę, że jest to coś, co nazywa się z punktu 1).

Niektóre modyfikacje Custom DGV:
1) Skonfigurowany do obsługi przeciągania wielu wierszy.
2) Punkt 1 wymagał nadpisania OnCellPainting w celu narysowania linii przeciągania. Funkcję można opublikować, jeśli wydaje się objawowa.
3) Problemy występują zawsze w przypadku zmiany rozmiaru (zarówno problem ręczny, jak i automatyczny może powodować problem), ale w zdarzeniu zmiany rozmiaru nie ma niestandardowego kodu.

późna edycja kod dla onCellPainting. Inne funkcje zastąpiły gridview: OnMouseDown, OnCellMouseDown, OnClick, OnMouseMove, OnDragOver, OnDragDrop, OnDragLeave, OnKeyDown, z których żaden nie wydaje się objawowy

   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

* Więcej edycji Żadna z tych czynności nie rozwiązuje problemu, jedyną rzeczą, która naprawia to PO problemie, jest AutoResizeRows (AllCells) // Naprawia to tylko AllCells. Jest bardzo powolny i niepożądany.

Odświeżać(); UpdateBounds (); Aktualizacja(); Unieważnić(); PerformLayout (); ResetBackColor (); ResetBindings (); ResetForeColor (); ResetText (); UpdateStyles ();

questionAnswers(4)

yourAnswerToTheQuestion