여기에서는 System.Windows.Forms.DataGrid 컨트롤을 수직 방향으로 스크롤 했을 때에, 다른 DataGrid도 동시에 스크롤 되는 방법을 소개합니다.


우선 DataGrid 컨트롤이 수직 방향으로 스크롤 된 것을 알려면 , Scroll 이벤트를 포착하거나 프로텍트 멤버의 GridVScrolled 메소드를 오버라이드(override) 하거나 같이 프로텍트 멤버의 VertScrollBar 프롭퍼티의 Scroll 이벤트를 포착하는 방법이 있습니다.


GridVScrolled 메소드나 VertScrollBar 프롭퍼티의 Scroll 이벤트를 포착하는 경우는, 주의가 필요합니다. 이것들은, 마우스의 휠을 사용한 스크롤이나, 커서 키에 의한 스크롤에는 반응하지 않습니다. 따라서, 이것들에 의한 스크롤에도 대응하기 위해서는, MouseWheel 이벤트등의 다른 방법도 병용 할 필요가 있습니다.


이하에 동시 스크롤을 가능하게 하는 DataGrid의 예를 나타냅니다.

 

''' <summary>
''' 동시 스크롤을 가능하게 하는 DataGrid
''' </summary>

Public Class MyDataGrid
    Inherits DataGrid

    Public Sub New()
        MyBase.New()
        AddHandler Me.Scroll, AddressOf MyDataGrid_Scroll
    End Sub

    Private _syncScrollGrid As MyDataGrid = Nothing

    ''' <summary>
    ''' 동시에 스크롤 시키는 DataGrid
    ''' </summary>

    Public Property SyncScrollGrid() As MyDataGrid
        Get
            Return _syncScrollGrid
        End Get
        Set(ByVal Value As MyDataGrid)
            If Not _syncScrollGrid Is Me Then
                _syncScrollGrid = Value
            Else
                Throw New ApplicationException("설정에 실패했습니다.")
            End If
        End Set
    End Property

    ''' <summary>
    ''' 지정한 위치까지 스크롤한다.
    ''' </summary>

    ''' <param name="rowNum">이 위치까지 스크롤한다.</param>
    Public Sub SetTopRow(ByVal rowNum As Integer)
        Dim args As New ScrollEventArgs(ScrollEventType.LargeIncrement, rowNum)
        MyBase.GridVScrolled(Me, args)
    End Sub

    Private Sub MyDataGrid_Scroll(ByVal sender As Object, ByVal e As EventArgs)
        If Not (_syncScrollGrid Is Nothing) Then

            '지정위치까지 스크롤한다.

            _syncScrollGrid.SetTopRow(VertScrollBar.Value)
        End If

        '포커스가 다른 컨트롤로 이동되지 않도록 한다.

        Me.Focus()
    End Sub
End Class

 

이 클래스를 사용하려면, DataGrid 컨트롤을 이 MyDataGrid에 옮겨놓습니다.

유저가 스크롤 하는 DataGrid의 스크롤과 동시에 스크롤 시키고 싶은 DataGrid의 양쪽 모두에 MyDataGrid를 사용합니다. 그리고 유저가 스크롤 하는 MyDataGrid의 SyncScrollGrid 프롭퍼티에, 동시에 스크롤 시키고 싶은 MyDataGrid를 지정합니다. 또한 양자의 MyDataGrid의 행수는 반드시 같게 해 주세요.

+ Recent posts