【发布时间】:2023-04-11 11:49:01
【问题描述】:
我有一个带有 DataGridView 的表单。我的格式是这样的:
dgvECN.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
dgvECN.Columns(0).Width = 50
...
dgvECN.Columns(15).Width = 100
dgvECN.DefaultCellStyle.WrapMode = DataGridViewTriState.True
网格总是比一个屏幕上显示的数据多,所以我依赖滚动条——主要是垂直滚动条。如果我用鼠标抓住滚动条并将其拖到最下方,它可能会在滚动条向下的大约 97% 处停止,就好像我已经到达底部并且我有更多行数据' 尚未滚动到。我可以释放滚动条并再次抓住它并向下拖动它会进一步下降,但不会一直下降。在第四次尝试(使用当前数据)时,它到达了底部。
我可以按住滚动条底部的向下箭头,这样就可以了。我可以将光标/箭头向下或向下翻页一直到底部。当我做任何这些事情时,滚动手柄会向下抖动,然后向上抖动,就像它正在重新计算或其他东西一样。
我尝试过使用以下方式加载表单并显示数据的底部:
dgvECN.FirstDisplayedScrollingRowIndex = dgvECN.RowCount - 1
但这会将视图滚动到网格最初认为是底部而不是实际底部的数据区域周围。
我认为这是我第一次在网格的单元格中使用环绕文本,所以我怀疑这是一个原因。
但我一直在阅读和阅读,虽然我发现了很多起初听起来相关的奇异错误和错误,但它们最终都不是我的问题,而且我还没有找到任何可以修复它的东西。
请随时在评论中询问有关我的项目的具体信息,我不确定您可能需要什么来帮助诊断此问题。感谢您的宝贵时间!
ETA:.NET 4.0 和 VS Express 2013,以防万一。
ETA2:我尝试设置加载显示,使其显示数据的底部而不是顶部。我正在这样做:
dgvECN.CurrentCell = dgvECN.Item(0, dgvECN.Rows.Count - 1)
但这实际上并没有把它带到数据的底部。我想这是同样错误的表现。
ETA3:这是加载当前单元格设置为底行时的样子:
ETA4:DataGridView 设计器代码:
'
'dgvECN
'
Me.dgvECN.AllowUserToAddRows = False
Me.dgvECN.AllowUserToDeleteRows = False
Me.dgvECN.AllowUserToOrderColumns = True
Me.dgvECN.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.dgvECN.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill
Me.dgvECN.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
Me.dgvECN.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.dgvECN.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Check})
Me.dgvECN.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically
Me.dgvECN.Location = New System.Drawing.Point(3, 3)
Me.dgvECN.Name = "dgvECN"
Me.dgvECN.Size = New System.Drawing.Size(1102, 670)
Me.dgvECN.TabIndex = 5
【问题讨论】:
-
我不确定你能做到。从未尝试过,但我的假设是在调整滚动条大小时,rowHeight 是根据默认值或最小值计算的。所以当你到达最后会发生什么,它只是将 x 行添加到下面的滚动条中。但是如果那里也有任何包装的行,在结束之前,它会再次停止,并再次更新等等......你可以设置一个静态的rowHeight,但这很难看......或者也许以某种方式计算手动所有行的高度,并更新......不确定是否可能,无论如何,PITA。
-
是的,我感觉好像它也必须与此有关。但我简直不敢相信没有一种“正确”的方法可以做到这一点。
-
好吧,您可以将最后一条记录设置为当前记录,然后将其设置回第一条,作为一种廉价的黑客攻击。不过,您必须在此期间停止处理
OnPaint,否则您会在它发生时出现一些视觉故障。我想我用SetCurrentCellAddressCore(columnIndex, rowIndex, False, False, True)做类似的事情。嗯,如果你不处理OnPaint,网格可能会变黑:\ -
hmm 再想一想,
SuspendLayout()可能会成功,但不确定如果必须滚动列表,单元格/行选择是否会触发布局更改。在任何情况下,您都可以Hide()网格代替,然后在完成后Show()它。 -
@clweeks AutoScaleMode 属性位于 DataGrid 的顶部容器(用户控件或窗体)上。
标签: .net vb.net winforms datagridview scrollbars