DataGridView:如何使滚动条与当前单元格选择同步?

时间:2010-06-02 22:15:12

标签: visual-studio-2005 datagridview

我有一个带有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;

该行将设置为顶部,但滚动条的位置仍然不同步。不确定是否有办法让滚动条的位置与代码中设置的所选行同步?

2 个答案:

答案 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