派生DataGridView绘图问题。显示黑色区域

时间:2009-08-19 14:24:14

标签: c# .net winforms visual-c++ datagridview

延迟编辑我将此标记为C#问题以及C ++,因为问题出现在两种语言中,而解决方案如果显示的很可能是在C#中(市场的大部分)。

我一直在.net 2.0下开发一个应用程序(C ++具体但不相关)。

此应用程序使用自定义派生的datagridview。此数据网格视图偶尔会出现关于不包含单元格的DGV区域以及滚动条的严重伪像问题。 在某些调整大小操作期间,黑色矩形将在datagridview的底部绘制,这实际上会限制网格的大小。滚动条也会缩小以适应非粗糙区域。在我看来,因为系统认为DGV尺寸错误,并且正在进入错误的区域。

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

我只能通过两种方法来解决症状:
 1.单击要调整大小的列将自动修复网格
 2.在DGV中调用AutoResizeRows()函数将执行修复(但我认为是从第1点调用的内容)。

Custom DGV的一些修改:
1)配置为处理多行的拖放。
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(); 更新(); 无效(); PerformLayout(); ResetBackColor(); ResetBindings(); ResetForeColor(); ResetText(); UpdateStyles();

5 个答案:

答案 0 :(得分:7)

听起来我的控件并没有正确呈现布局 您是否在代码中的某个位置暂停布局,然后从不重新布局?

这样做可以使您的控件正常运行,但不能正确布置所有组件。

答案 1 :(得分:0)

尝试在构造函数中将控件的.ResizeRedraw属性设置为true,看看是否有帮助。

来自MSDN

  

获取或设置一个值,该值指示控件在调整大小时是否重绘自身。

答案 2 :(得分:0)

尝试使用OnPaint中的网格背景清除图形:

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

答案 3 :(得分:0)

由于resx事件引用的某些mDataGridView_CellPainting文件没有被加载,我遇到了同样的问题。 DataGridView调整大小的速度也很慢。

答案 4 :(得分:0)

我通过以下方法解决了这个问题:在load事件中最大化Form,填充Datagridview,然后将Form重置为起始大小。在那之后,所有调整大小似乎都能按预期工作。 VB.Net代码,但您有要点:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim StartSize As Size = Me.Size
    Me.Width = Integer.MaxValue
    Me.Height = Integer.MaxValue
    Me.Visible = False
' ... Populate and format the datagridview ...
    Me.Size = StartSize
    Me.Visible = True
End Sub