OVH Cloud OVH Cloud

2 datagrid - Scroll ensemble

3 réponses
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.

3 réponses

Avatar
Zoury
je t'avais répondu au "mauvais" message..


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.


Avatar
Zoury
note que la variable _bScrollValueIsChanging pourrait/devrait plutôt
s'appeller _bIgnoreGridScrolledEvent.. j'ai modifié son utilisation suite à
quelques essais et j'ai oublié de la renommer ce qui rendrait le code plus
compréhensible. :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Zoury
autre modif, change :
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



pour :
'***
Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)
If (Not _bLinkedGridIsChanging) Then
_bLinkedGridIsChanging = True
If (Value Is Nothing) Then
_dgLinkedGrid = Nothing
_dgLinkedGrid.LinkedGrid = Nothing
Else
_dgLinkedGrid = Value
_dgLinkedGrid.LinkedGrid = Me
End If
_bLinkedGridIsChanging = False
End If
End Set
End Property
'***

--
Cordialement
Yanick
MVP pour Visual Basic