我正在使用VS 2005编写的项目(修复bug)。表单上有一个DataGridView控件。首次加载时,控件的数据网格将手动或以代码的形式填充来自集合的数据行。实际上,有方法PopulateDataGrid()完成这项工作。
表格上还有另一个控件。更改控件后,将首先清除数据网格,然后通过PopulateDataGrid()再次重新填充行。问题是,当刷新网格时,垂直滚动条不会正确重置。我认为应该是。由于滚动条未重置,当我尝试点击网格并向下移动时,我得到例外:{“'222'的值对'值'无效。'值'应介于'最小'和'最大值之间'。\ r \ nParameter name:Value“}:
at System.Windows.Forms.ScrollBar.set_Value(Int32 value)
at System.Windows.Forms.DataGridView.ScrollRows(Int32 rowCount, Int32 deltaY, ScrollEventType scrollEventType)
at System.Windows.Forms.DataGridView.ScrollRowsByCount(Int32 rows, ScrollEventType scrollEventType)
at System.Windows.Forms.DataGridView.ScrollRowIntoView(Int32 columnIndex, Int32 rowIndex, Boolean committed, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.ScrollIntoView(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.ProcessDownKeyInternal(Keys keyData, Boolean& moved)
at System.Windows.Forms.DataGridView.ProcessDataGridViewKey(KeyEventArgs e)
at System.Windows.Forms.DataGridView.OnKeyDown(KeyEventArgs e)
at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
...
网格控件的所有设置都是默认值。例如,ScrollBars是Both。以下是设置行自动大小属性的唯一相关位置:
poDataGridView.AutoSizeRowsMode =
DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
我不确定我是否需要在设计师中设置任何属性?
答案 0 :(得分:4)
我想我已经解决了这个问题。我必须在刷新之前将控件的滚动条设置为none,并在我的刷新方法调用中重置为两者:
private void PopulateDataGrid() {
dataGrid.Rows.Clear();
dataGrid.ScrollBars = ScrollBars.None;
// continue to get new data and populate cells....
dataGrid.ScrollBars = ScrollBars.Both;
}
答案 1 :(得分:3)
您可以使用
dataGridView.PerformLayout();
为了强制刷新数据网格滚动条,这通常可以解决这个问题,但如果它不起作用,只需确保dataGrid中列的插入和删除在活动时完成(启用) )它会自行刷新。
答案 2 :(得分:0)
我在一个选项卡上有一个类似DataGrid的情况,另一个选项卡上有一些输入控件。我将使用控件更新数据,并保存和刷新数据。返回主列表选项卡,将禁用滚动条。
我发现使用datarefresh方法中的代码重置滚动条并没有解决问题。
我如何处理它是设置一个标志,表明数据已刷新,当用户选择主列表选项卡(包含datagrid)时,此标志将确定是否手动设置网格排序列和排序方向。这似乎有效。
似乎网格必须处于活动状态,然后重置排序列将导致滚动条更新。但是什么是解决方法!