我有一个带有DataGridView的Windows应用程序作为数据表示。每隔2分钟,网格将刷新新数据。为了使滚动条与添加的新数据保持同步,我必须重置其ScrollBars:
dbv.Rows.Clear(); // clear rows
SCrollBars sc = dbv.ScrollBars;
dbv.ScrollBars = ScrollBars.None;
// continue to populate rows such as dbv.Rows.Add(obj);
dbv.ScrollBars = sc; // restore the scroll bar setting back
使用上述代码,数据刷新后滚动条会再次显示。问题是应用程序需要在刷新后将某个单元格设置为选中:
dbv.CurrentCell = dbv[0, selectedRowIndex];
使用上面的代码,选择单元格;但是,滚动条的位置不会反映所选单元格行位置的位置。当我尝试在刷新后移动滚动条时,网格将跳转到第一行。
重置后似乎滚动条位置设置回0。设置网格的CurrentCell的代码不会导致滚动条重新定位到正确的位置。据我所知,在DataGriadView中没有属性或方法来获取或设置滚动条的值。
我还尝试将所选行设置为顶部:
dbv.CurrentCell = dbv[0, selectedRowIndex];
dbv.FirstDisplayedScrollingRowIndex = selectedRowIndex;
该行将设置为顶部,但滚动条的位置仍然不同步。不确定是否有办法让滚动条的位置与代码中设置的所选行同步?
答案 0 :(得分:1)
我找到了解决问题的答案。正如我所提到的,控件没有方法或属性来设置正确的滚动条值。但是,如果直接与UI进行交互(如触摸滚动条或网格单元格),则滚动条和DatagridView内容将显示正确。看起来控制需要重新聚焦和重新绘制。
只需使用以下代码不会导致滚动条重置:
dgv.Select();
// or dbv.Focuse();
我发现的方法是我必须让DatagridView控件再次消失。幸运的是,我有一个带有几个选项卡的选项卡控件。然后我切换选项卡以重置滚动条:
int index = myTabCtrl.SelectedIndex;
if (index == (myTabCtrl.TabCount)) {
dgv.SeletecedIndex = 0;
}
else {
dgv.SelectedIndex = index + 1;
}
myTabCtrl.SelectedIndex = index;
如果您无法在表单上隐藏DatagridView,则可以将表单最小化,然后将其还原。
问题在于用户界面会有新鲜感。
答案 1 :(得分:0)
看起来,TAB,SHIFT + TAB,END键并不总是将最后一列带入可见视图。 CurrentCellChanged事件处理程序中的以下代码似乎解决了这个问题(vb.net):
If Me.MyDataGridView.CurrentCell IsNot Nothing Then
Dim currentColumnIndex As Integer = e.MyDataGridView.CurrentCell.ColumnIndex
Dim entireRect As Rectangle = _
Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, False)
Dim visiblePart As Rectangle = _
Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, True)
If (visiblePart.Width < entireRect.Width) Or (entireRect.Width = 0) Then
Me.MyDataGridView.FirstDisplayedCell = Me.MyDataGridView.CurrentCell
'OR Me.MyDataGridView.FirstDisplayedScrollingColumnIndex = currentColumnIndex
End If
End If