OVH Cloud OVH Cloud

2 datagrid - scroll ensemble

1 réponse
Avatar
Annie L.
J'ai 2 datagrid côte à côte. Si je 'Scroll' un datagrid, j'aimerais que
l'autre datagrid suive le scroll de l'autre.
Comment faire?
Merci de votre aide.

1 réponse

Avatar
Zoury
Bonjour! :O)

Voici une façon non api d'y parvenir :

on se fait une classe qui hérite du DataGrid, cela nous donne accès à 2
membres protégées nommés HorizScrollBar et VertScrollBar (qui sont les
ScrollBars du grid). J'ai exposé la valeur (position) des ces barres de
défilement en tant que propriété publique dans notre objet (HorizScrollValue
et VertScrollValue). J'ai aussi ajouté une propriété publique nommé
LinkedGrid qui précise à quel autre Grid notre Grid est lier..
'***
' Classe LinkableDataGrid (herite de DataGrid)
Option Explicit On

Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Public Class LinkableDataGrid
Inherits DataGrid

Private _dgLinkedGrid As LinkableDataGrid
Private _bLinkedGridIsChanging As Boolean
Private _bScrollValueIsChanging As Boolean

Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)
If (Not _bLinkedGridIsChanging) Then
_bLinkedGridIsChanging = True
_dgLinkedGrid = Value
_dgLinkedGrid.LinkedGrid = Me
_bLinkedGridIsChanging = False
End If
End Set
End Property
Public Property HorizScrollValue() As Int32
Get
Return Me.HorizScrollBar.Value
End Get
Set(ByVal Value As Int32)
Me.HorizScrollBar.Value = Value
End Set
End Property
Public Property VertScrollValue() As Int32
Get
Return Me.VertScrollBar.Value
End Get
Set(ByVal Value As Int32)
Me.VertScrollBar.Value = Value
End Set
End Property

Protected Overrides Sub GridHScrolled(ByVal sender As Object, ByVal se
As System.Windows.Forms.ScrollEventArgs)
If (Not _bScrollValueIsChanging) Then
MyBase.GridHScrolled(sender, se)
If (Not LinkedGrid Is Nothing) Then
_dgLinkedGrid.HorizScrollValue = se.NewValue
_bScrollValueIsChanging = True
' permet la resynchronisation du grid avec sa scrollbar
_dgLinkedGrid.GridHScrolled(sender, se)
_bScrollValueIsChanging = False
End If
End If
End Sub

Protected Overrides Sub GridVScrolled(ByVal sender As Object, ByVal se
As System.Windows.Forms.ScrollEventArgs)
If (Not _bScrollValueIsChanging) Then
MyBase.GridVScrolled(sender, se)
If (Not LinkedGrid Is Nothing) Then
_dgLinkedGrid.VertScrollValue = se.NewValue
_bScrollValueIsChanging = True
' permet la resynchronisation du grid avec sa scrollbar
_dgLinkedGrid.GridVScrolled(sender, se)
_bScrollValueIsChanging = False
End If
End If
End Sub

End Class
'***

on l'utilise comme suit :
'***
' Classe Form1 (test la classe LinkableDataGrid)
Option Explicit On

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1
Inherits System.Windows.Forms.Form

Private _dt As DataTable
Friend WithEvents DataGrid1 As LinkableDataGrid
Friend WithEvents DataGrid2 As LinkableDataGrid

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

InitGrids()
InitDataSource()
BindDataSource()

End Sub

Private Sub InitGrids()

Me.DataGrid1 = New LinkableDataGrid
Me.DataGrid2 = New LinkableDataGrid

'DataGrid1
Me.DataGrid1.DataMember = ""
Me.DataGrid1.HeaderForeColor System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location = New System.Drawing.Point(8, 8)
Me.DataGrid1.Name = "DataGrid1"
Me.DataGrid1.Size = New System.Drawing.Size(312, 216)
Me.DataGrid1.TabIndex = 0

'DataGrid2
Me.DataGrid2.DataMember = ""
Me.DataGrid2.HeaderForeColor System.Drawing.SystemColors.ControlText
Me.DataGrid2.Location = New System.Drawing.Point(328, 8)
Me.DataGrid2.Name = "DataGrid2"
Me.DataGrid2.Size = New System.Drawing.Size(328, 216)
Me.DataGrid2.TabIndex = 1

' on les ajoute sur le formulaire
Me.Controls.Add(Me.DataGrid2)
Me.Controls.Add(Me.DataGrid1)

' on les link ensemble
DataGrid1.LinkedGrid = DataGrid2


End Sub
Private Sub InitDataSource()

_dt = New DataTable

_dt.Columns.Add("ID", Type.GetType("System.Int32"))
_dt.Columns.Add("Nom", Type.GetType("System.String"))
_dt.Columns.Add("Prénom", Type.GetType("System.String"))

_dt.Rows.Add(New Object() {1, "Lefebvre", "Yanick"})
_dt.Rows.Add(New Object() {2, "Dubuc", "Maurice"})
_dt.Rows.Add(New Object() {3, "Labonté", "Jean-René"})
_dt.Rows.Add(New Object() {4, "Lalonde", "Martin"})
_dt.Rows.Add(New Object() {5, "Levasseur", "Marie"})
_dt.Rows.Add(New Object() {6, "Tremblay", "Jean"})
_dt.Rows.Add(New Object() {7, "Rodriguez", "Rodrigue"})
_dt.Rows.Add(New Object() {8, "Bellemare", "Geneviève"})
_dt.Rows.Add(New Object() {9, "Montreuil", "Adèle"})
_dt.Rows.Add(New Object() {10, "Lachance", "Jean"})
_dt.Rows.Add(New Object() {11, "Laroche", "Denise"})
_dt.Rows.Add(New Object() {12, "Montellier", "Marc"})

End Sub
Private Sub BindDataSource()

DataGrid1.DataSource = _dt
DataGrid2.DataSource = _dt

End Sub

End Class
'***

en espérant que l'exemple soit assez claire.. :O)

--
Cordialement
Yanick
MVP pour Visual Basic
"Annie L." a écrit dans le message de
news:
J'ai 2 datagrid côte à côte. Si je 'Scroll' un datagrid, j'aimerais que
l'autre datagrid suive le scroll de l'autre.
Comment faire?
Merci de votre aide.