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

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

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

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

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

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

Custom DGV的一些修改:
1)配置为处理多行的拖放。
2)点1要求重写OnCellPainting以绘制拖动线。 如果看起来有症状,可以发布function。
3)问题总是发生在resize(手动和自动都会导致问题),但resize事件中没有自定义代码。

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 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();

听起来像你的控件没有正确渲染其布局。
您是否在代码中的某个位置暂停布局,然后从不重新布局?

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

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

来自MSDN :

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

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

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

我有一些问题是由一些没有加载的resx文件引起的,这些文件是从mDataGridView_CellPainting事件中引用的。 DataGridViewresize也很慢。