延迟编辑我将此标记为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)问题总是发生在调整大小(手动和自动都会导致问题),但调整大小事件中没有自定义代码。
晚编辑代码。在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();
答案 0 :(得分:7)
听起来我的控件并没有正确呈现布局 您是否在代码中的某个位置暂停布局,然后从不重新布局?
这样做可以使您的控件正常运行,但不能正确布置所有组件。
答案 1 :(得分:0)
答案 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