none
Synchronized scrolling between two datagrid

    General discussion

  • Let say I have two datagrids side by side, and the amount of rows are always going to be the same.  I would liked when one scrolls vertically from one datagrid, the other datagrid would scroll the same amount automatically.  Is this possible?
    Friday, February 21, 2003 6:16 PM

All replies

  • Not without some fancy footwork!

    It appears that the DataGrid control doesn't expose enough stuff to do this easily, but if you create your own class that inherits from DataGrid, you can do it.

    I created a new class, like this:

    Public Class MyDataGrid
      Inherits DataGrid

      Public ReadOnly Property Scrollbar()
        Get
          Return MyBase.VertScrollBar
        End Get
      End Property

      Public Sub ScrollToRow(ByVal Row As Integer)
        MyBase.GridVScrolled(Me, _
         New ScrollEventArgs(ScrollEventType.ThumbPosition, Row))
      End Sub
    End Class

    This class exposes the protected VertScrollbar and GridVScrolled members of the DataGrid class. I created a form using standard DataGrid controls, laid things out as I wanted them, set up the data binding and so on, and then modified the form's code to use MyDataGrid instances rather than DataGrid instances. 

    Finally, I added code to trap the Scroll event of DataGrid1's vertical scroll bar (my form included a SqlDataAdapter component filling two DataSet components--you'll need to disregard my data handling and use your own):

      Private WithEvents vsb1 As VScrollBar

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SqlDataAdapter1.Fill(DataSet1)
        SqlDataAdapter1.Fill(DataSet2)
        vsb1 = DataGrid1.Scrollbar
      End Sub

      Private Sub DataGrid1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Scroll
        DataGrid2.ScrollToRow(vsb1.Value)
      End Sub

    That's it. Worked great. It doesn't handle all situations (what if you have relations in your grid? You have to make sure both grids are showing the same view of the relations, which can be done), but it does answer your original question. It was fun working out a solution! 
    Saturday, February 22, 2003 7:11 PM
  • Hey guys, just wanted to let you know that I sent this to an MS Wishlist for consideration, basically saying it would be nice to have more access to current scroll positions, etc.
    Monday, February 24, 2003 5:14 PM
  • Yes, it would be a lot easier if you had some access to the grid's viewport from within code without having to go to this extra trouble. OTOH, it's not all THAT hard, right? Just takes a little digging <g>. It just ought to be easier.
    Tuesday, February 25, 2003 9:01 AM
  • Thanks, Ken. This works great! I know absolutely nothing about VB, but converting to C# was not that bad.

    Royce
    Sunday, October 03, 2004 4:57 PM