代码之家  ›  专栏  ›  技术社区  ›  David.Chu.ca

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

  •  3
  • David.Chu.ca  · 技术社区  · 16 年前

    我有一个以DataGridView作为数据表示的Windows应用程序。每2分钟,网格将用新数据刷新一次。为了使滚动条与添加的新数据保持同步,我必须重置其滚动条:

    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。设置网格当前单元格的代码不会导致滚动条重新定位到正确的位置。据我所知,在DataGridView中没有获取或设置滚动条值的属性或方法。

    我还尝试将所选行设置为顶部:

    dbv.CurrentCell = dbv[0, selectedRowIndex];
    dbv.FirstDisplayedScrollingRowIndex = selectedRowIndex;
    

    行将被设置为顶部,但滚动条的位置仍然不同步。不确定是否有任何方法可以使滚动条的位置与在代码中设置的所选行同步?

    2 回复  |  直到 14 年前
        1
  •  1
  •   David.Chu.ca    16 年前

    我找到了解决问题的答案。正如我提到的,控件没有方法或属性来设置正确的滚动条值。但是,如果有直接指向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,您可以简单地最小化窗体,然后将其还原。

    问题是UI上会有一个新的。

        2
  •  0
  •   synergetic    14 年前

    似乎,tab、shift+tab、end键并不总是将最后一列带到可见视图中。 当前CellChanged事件处理程序中的以下代码似乎可以解决此问题(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
    
    推荐文章