OVH Cloud OVH Cloud

À Yannick MVP - 2 datagrid-scroll

18 réponses
Avatar
Annie L.
Votre exemple fonctionne très bien et c'est ce qu'il me fallait!
Mais, il y a un petit problème :

J'ai déjà 2 datagrid sur mon formulaire et ils ont leurs propres
'TableStyle' et leur 'data source'. Comment appliquer votre exemple! J'ai
essayé différentes méthodes avec votre exemples et cela ne fonctionne pas du
tout!
Il me manque sûrement un petit quelque chose!

Je suis débutante depuis peu et ce n'est pas facile!!!

Merci de votre aide précieuse!

10 réponses

1 2
Avatar
Zoury
Salut Annie! :O)

J'ai déjà 2 datagrid sur mon formulaire et ils ont leurs propres
'TableStyle' et leur 'data source'. Comment appliquer votre exemple!



ça ne t'embete pas que je te tutoies ? Et je te pris de faire de même... ça
me fait vieillir sinon.. :O)


Si tu observes bien la déclaration de la classe LinkableDataGrid (que tu
peux renommer à ta guise en passant)
'***
Public Class LinkableDataGrid
Inherits DataGrid
' tout plein de code ici
End Class
'**
on voit quelle hérite de la classe DataGrid. Tu peux considéré que ton
LinkableDataGrid **EST** un DataGrid, elle offre les mêmes membres (dont
TableStyles et DataSource).


Donc tout ce dont tu as à faire, c'est de remplacer le type de tes DataGrids
actuels par LinkableDataGrid (dans la région de code généré par l'éditeur de
code).

Ex, dans le code tu as surement quelque chose comme ceci :
'***
#Region " Code généré par le Concepteur Windows Form "

' bla bla bla

Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
Friend WithEvents DataGrid2 As System.Windows.Forms.DataGrid

Private Sub InitializeComponent()

Me.DataGrid1 = New System.Windows.Forms.DataGrid
Me.DataGrid2 = New System.Windows.Forms.DataGrid
Me.SuspendLayout()

' bla bla bla

End Sub

' bla bla bla

#End Region
'***

Tu dois remplacer le type DataGrid par LinkableDataGrid :
'***
#Region " Code généré par le Concepteur Windows Form "

' bla bla bla

Friend WithEvents DataGrid1 As LinkableDataGrid
Friend WithEvents DataGrid2 As LinkableDataGrid

Private Sub InitializeComponent()

Me.DataGrid1 = New LinkableDataGrid
Me.DataGrid2 = New LinkableDataGrid
Me.SuspendLayout()

' bla bla bla

End Sub

' bla bla bla

#End Region
'***

et c'est tout. le code que tu avais devrait continuer fonctionner ...

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
Tout fonctionne très bien!
Mais après 3 à 4 compilation, il m'indique une erreur :
"La référence d'objet n'est pas définie à une instance d'un objet" il me
donne la ligne suivante comme erreur :

'Me.dgdCarnetHeures.LinkedGrid = Nothing'

Pourtant cela fonctionnait très bien!!! Bizarre!!!
Est-ce 'Nothing' ?

Un gros merci! j'en ai appris beaucoup sur la création d'événement avec tes
2 méthodes!


"Zoury" wrote:

Salut Annie! :O)

> J'ai déjà 2 datagrid sur mon formulaire et ils ont leurs propres
> 'TableStyle' et leur 'data source'. Comment appliquer votre exemple!

ça ne t'embete pas que je te tutoies ? Et je te pris de faire de même... ça
me fait vieillir sinon.. :O)


Si tu observes bien la déclaration de la classe LinkableDataGrid (que tu
peux renommer à ta guise en passant)
'***
Public Class LinkableDataGrid
Inherits DataGrid
' tout plein de code ici
End Class
'**
on voit quelle hérite de la classe DataGrid. Tu peux considéré que ton
LinkableDataGrid **EST** un DataGrid, elle offre les mêmes membres (dont
TableStyles et DataSource).


Donc tout ce dont tu as à faire, c'est de remplacer le type de tes DataGrids
actuels par LinkableDataGrid (dans la région de code généré par l'éditeur de
code).

Ex, dans le code tu as surement quelque chose comme ceci :
'***
#Region " Code généré par le Concepteur Windows Form "

' bla bla bla

Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
Friend WithEvents DataGrid2 As System.Windows.Forms.DataGrid

Private Sub InitializeComponent()

Me.DataGrid1 = New System.Windows.Forms.DataGrid
Me.DataGrid2 = New System.Windows.Forms.DataGrid
Me.SuspendLayout()

' bla bla bla

End Sub

' bla bla bla

#End Region
'***

Tu dois remplacer le type DataGrid par LinkableDataGrid :
'***
#Region " Code généré par le Concepteur Windows Form "

' bla bla bla

Friend WithEvents DataGrid1 As LinkableDataGrid
Friend WithEvents DataGrid2 As LinkableDataGrid

Private Sub InitializeComponent()

Me.DataGrid1 = New LinkableDataGrid
Me.DataGrid2 = New LinkableDataGrid
Me.SuspendLayout()

' bla bla bla

End Sub

' bla bla bla

#End Region
'***

et c'est tout. le code que tu avais devrait continuer fonctionner ...

--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Zoury
Salut Annie!

'Me.dgdCarnetHeures.LinkedGrid = Nothing'



oh! c'est normal... :O/

remplace la propriété LinkedGrid par ceci :
'***
Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)

' vérifie si une modifs est en cours
' si oui, on passe notre tour..
' cela évite la récursion infinie
' qui est causé par le fait que l'on modifie
' la propriété LinkedGrid de notre _dgLinkedGrid
' se qui déclancherait l'événement à nouveau...
If (Not _bLinkedGridIsChanging) Then

' vérifie la nouvelle valeur
' si elle est à Nothing, c'est que l'on veut délier les
grilles
' sinon, on branche les grilles ensembles..
If (Value Is Nothing) Then
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Nothing
_bLinkedGridIsChanging = False
_dgLinkedGrid = Nothing
ElseIf (Not _dgLinkedGrid Is Value) Then
_dgLinkedGrid = Value
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Me
_bLinkedGridIsChanging = False
_dgLinkedGrid.VertScrollValue = Me.VertScrollValue
_dgLinkedGrid.HorizScrollValue = Me.HorizScrollValue
End If

End If
End Set
End Property
'***

Un gros merci!


fait plaisir! :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
J'ai toujours le même problème!
J'ai ajouté dans 'Code généré par le Concepteur Windows Form'
les lignes suivantes :

Friend WithEvents dgdCarnetRV As LinkableDataGrid
Friend WithEvents dgdCarnetHeures As LinkableDataGrid

et plus bas .....

Me.dgdCarnetRV = New ClassLibrary.LinkableDataGrid
Me.dgdCarnetHeures = New ClassLibrary.LinkableDataGrid

il me rajoute plus bas dans les propriétés de chaque Datagrid :

Me.dgdCarnetRV.LinkedGrid = Nothing
Me.dgdCarnetHeures.LinkedGrid = Nothing

Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3 à 4
compilation, il me génère une erreur "La référence d'objet n'est pas définie
à une instance d'un objet"

J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le form., la
propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix dans
la liste qui s'ouvre avec comme choix les 2 datagrid.

Je dois faire quelque chose de pas correct!!!!

Merci de ton aide!!!






"Zoury" wrote:

Salut Annie!

> 'Me.dgdCarnetHeures.LinkedGrid = Nothing'

oh! c'est normal... :O/

remplace la propriété LinkedGrid par ceci :
'***
Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)

' vérifie si une modifs est en cours
' si oui, on passe notre tour..
' cela évite la récursion infinie
' qui est causé par le fait que l'on modifie
' la propriété LinkedGrid de notre _dgLinkedGrid
' se qui déclancherait l'événement à nouveau...
If (Not _bLinkedGridIsChanging) Then

' vérifie la nouvelle valeur
' si elle est à Nothing, c'est que l'on veut délier les
grilles
' sinon, on branche les grilles ensembles..
If (Value Is Nothing) Then
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Nothing
_bLinkedGridIsChanging = False
_dgLinkedGrid = Nothing
ElseIf (Not _dgLinkedGrid Is Value) Then
_dgLinkedGrid = Value
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Me
_bLinkedGridIsChanging = False
_dgLinkedGrid.VertScrollValue = Me.VertScrollValue
_dgLinkedGrid.HorizScrollValue = Me.HorizScrollValue
End If

End If
End Set
End Property
'***

> Un gros merci!
fait plaisir! :O)

--
Cordialement
Yanick
MVP pour Visual Basic






Avatar
Zoury
> il me rajoute plus bas dans les propriétés de chaque Datagrid :

Me.dgdCarnetRV.LinkedGrid = Nothing
Me.dgdCarnetHeures.LinkedGrid = Nothing



oups désolé..

modifie (dans la propriété LinkedGrid dans le Set) :
If (Value Is Nothing) Then

pour :
If ((Value Is Nothing) And (Not _dgLinkedGrid Is Nothing)) Then

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Zoury
> Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3 à 4
compilation, il me génère une erreur "La référence d'objet n'est pas


définie
à une instance d'un objet"




Le générateur de code a mit à jour sa section de code et a ajouté les lignes
suivantes :
'***
Me.dgdCarnetRV.LinkedGrid = Nothing
Me.dgdCarnetHeures.LinkedGrid = Nothing
'***
ce qui fesait planter le code.



J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le form.,


la
propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix


dans
la liste qui s'ouvre avec comme choix les 2 datagrid.

Je dois faire quelque chose de pas correct!!!!



mmm.. ici je peux sélectionner les grilles. vérifie si, après la
modification proposée dans l'autre message, tu obtiens toujours le même
résultat. sinon on cherchera pourquoi.. :O)


--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
Ça fonctionne très bien!
Mais j'ai un autre problème que j'ai oublié de te parler!
Ce que j,essaie de faire, est un peu comme dans Excel. Geler une colonne
(ex.: dans datagrid_heures = seulement les heures de rendez-vous. Dans
datagrid_rendez-vous = chaque colonne est égale à un employé, donc plusieurs
colonnes.)
Jusqu'à date cela fonctionne très bien.
Mais lorsque je fais défiler le 'scroll' du bas (horiz.), il ne faut pas
qu'il fasse défiler l'autre datagrid (heures). Présentement, c'est ce qu'il
fait et cela 'plante' le programme. Il faudrait 'désactiver' le scroll du
bas. J'ai essayé de mettre en commentaires la propriété de ce 'scroll' et là
cela me génère des erreurs avant la compilation!

Que me suggère-tu? Merci! on approche du but recherché!

"Zoury" wrote:

> Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3 à 4
> compilation, il me génère une erreur "La référence d'objet n'est pas
définie
> à une instance d'un objet"


Le générateur de code a mit à jour sa section de code et a ajouté les lignes
suivantes :
'***
Me.dgdCarnetRV.LinkedGrid = Nothing
Me.dgdCarnetHeures.LinkedGrid = Nothing
'***
ce qui fesait planter le code.



> J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le form.,
la
> propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix
dans
> la liste qui s'ouvre avec comme choix les 2 datagrid.
>
> Je dois faire quelque chose de pas correct!!!!

mmm.. ici je peux sélectionner les grilles. vérifie si, après la
modification proposée dans l'autre message, tu obtiens toujours le même
résultat. sinon on cherchera pourquoi.. :O)


--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Zoury
Salut Annie!

essai cette classe, c'est l'autre modifié un peu, j'y ai ajouté une
propriété nommé ScrollMode qui te permet de sélectionner laquelle(s) des
barres de défilement sera "linker" avec l'autre grid. :
'***
Option Explicit On

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

<Flags()> _
Public Enum ScrollModes
NotSet = 0
Horizontal = 1
Vertical = 2
Both = 3
End Enum

Public Class LinkableDataGrid
Inherits DataGrid

' attributs
Private _eScrollMode As ScrollModes
Private _dgLinkedGrid As LinkableDataGrid

' variables
Private _bLinkedGridIsChanging As Boolean
Private _bScrollModeIsChanging As Boolean
Private _bIgnoreGridLinkedEvent As Boolean

<DefaultValue(ScrollModes.NotSet)> _
Public Property ScrollMode() As ScrollModes
Get
Return _eScrollMode
End Get
Set(ByVal Value As ScrollModes)
If ((Not _bScrollModeIsChanging) And (Not
_bLinkedGridIsChanging)) Then
_eScrollMode = Value
If (Not _dgLinkedGrid Is Nothing) Then
_bScrollModeIsChanging = True
_dgLinkedGrid.ScrollMode = Value
_bScrollModeIsChanging = False
End If
End If
End Set
End Property
Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)

' vérifie si une modifs est en cours
' si oui, on passe notre tour..
' cela évite la récursion infinie
' qui est causé par le fait que l'on modifie
' la propriété LinkedGrid de notre _dgLinkedGrid
' se qui déclancherait l'événement à nouveau...
If ((Not _bScrollModeIsChanging) And (Not
_bLinkedGridIsChanging)) Then

' vérifie la nouvelle valeur
' si elle est à Nothing, c'est que l'on veut délier les
grilles
' sinon, on branche les grilles ensembles..
If ((Value Is Nothing) And (Not _dgLinkedGrid Is Nothing))
Then
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Nothing
_bLinkedGridIsChanging = False
_dgLinkedGrid = Nothing
ElseIf (Not _dgLinkedGrid Is Value) Then
_dgLinkedGrid = Value
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Me
_bLinkedGridIsChanging = False
_dgLinkedGrid.HorizScrollValue = Me.HorizScrollValue
_dgLinkedGrid.VertScrollValue = Me.VertScrollValue
_dgLinkedGrid.ScrollMode = _eScrollMode
End If

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 _bIgnoreGridLinkedEvent) Then
MyBase.GridHScrolled(sender, se)
If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
ScrollModes.Horizontal) = ScrollModes.Horizontal)) Then
_dgLinkedGrid.HorizScrollValue = se.NewValue
_bIgnoreGridLinkedEvent = True
_dgLinkedGrid.GridHScrolled(sender, se)
_bIgnoreGridLinkedEvent = False
End If
End If
End Sub
Protected Overrides Sub GridVScrolled(ByVal sender As Object, ByVal se
As System.Windows.Forms.ScrollEventArgs)
If (Not _bIgnoreGridLinkedEvent) Then
MyBase.GridVScrolled(sender, se)
If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
ScrollModes.Vertical) = ScrollModes.Vertical)) Then
_dgLinkedGrid.VertScrollValue = se.NewValue
_bIgnoreGridLinkedEvent = True
_dgLinkedGrid.GridVScrolled(sender, se)
_bIgnoreGridLinkedEvent = False
End If
End If
End Sub

End Class
'***

dans ton cas (tu ne veux pas du scroll du bas), utilise ScrollModes.Vertical
:O)

--
Cordialement
Yanick
MVP pour Visual Basic
"Annie L." a écrit dans le message de
news:
Ça fonctionne très bien!
Mais j'ai un autre problème que j'ai oublié de te parler!
Ce que j,essaie de faire, est un peu comme dans Excel. Geler une colonne
(ex.: dans datagrid_heures = seulement les heures de rendez-vous. Dans
datagrid_rendez-vous = chaque colonne est égale à un employé, donc


plusieurs
colonnes.)
Jusqu'à date cela fonctionne très bien.
Mais lorsque je fais défiler le 'scroll' du bas (horiz.), il ne faut pas
qu'il fasse défiler l'autre datagrid (heures). Présentement, c'est ce


qu'il
fait et cela 'plante' le programme. Il faudrait 'désactiver' le scroll du
bas. J'ai essayé de mettre en commentaires la propriété de ce 'scroll' et



cela me génère des erreurs avant la compilation!

Que me suggère-tu? Merci! on approche du but recherché!

"Zoury" wrote:

> > Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3


à 4
> > compilation, il me génère une erreur "La référence d'objet n'est pas
> définie
> > à une instance d'un objet"
>
>
> Le générateur de code a mit à jour sa section de code et a ajouté les


lignes
> suivantes :
> '***
> Me.dgdCarnetRV.LinkedGrid = Nothing
> Me.dgdCarnetHeures.LinkedGrid = Nothing
> '***
> ce qui fesait planter le code.
>
>
>
> > J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le


form.,
> la
> > propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix
> dans
> > la liste qui s'ouvre avec comme choix les 2 datagrid.
> >
> > Je dois faire quelque chose de pas correct!!!!
>
> mmm.. ici je peux sélectionner les grilles. vérifie si, après la
> modification proposée dans l'autre message, tu obtiens toujours le même
> résultat. sinon on cherchera pourquoi.. :O)
>
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
>
>


Avatar
Annie L.
Bonjour!!!
Wow! super! mais je ne saisie pas le "scrollModes". Présentement j'ai 2
nouvelles propriétés 'HorizScrollValue' et 'VertScrollValue' qui ont comme
valeur "0". Si je change ces propriétés soit à "1" ou "2", j'obtient un
message me disant que la valeur saisie n'est pas correcte.

En Éxécutant mon application, le 'scroll' du bas n'affecte pas l'autre
datagrid. C'est parfait, mais complexe comme programmation!!!
Mais le 'scroll' vertical ne fonctionne pas. J'aimerais savoir comment
appliquer le 'ScrollModes'.

Autre chose que j'ai remarqué hier! Quand je 'scroll' verticalement, cela
fonctionne très bien. Mais je n'arrive pas à pouvoir cliquer sur ma dernière
ligne et si j'arrive à cliquer sur la fraction de ligne que je vois, il
bousille les coordonnées de ma ligne à cause du 'scroll' du bas qui cache au
3/4 ma ligne parce que j'ai plusieurs colonnes. Mais si j'ai 3 à 4 colonnes
par exemple, tout est correct car il n'y a pas de 'scroll' dans le bas. Je
trouverai bien une solution! Tu m'as apportée une aide incroyable et je t'en
remercie grandement et j'espère que d'autres programmeurs auront suivi le
déroulement de cette fonctionnalité et qui servira à développer d'autres
classes.
Ce sont des exemples que nous ne retrouvons pas dans des livres (et j'en ai
plusieurs)!
Cela faisait plus d'un mois que je renvoyait mon 'Post' sur le site et enfin
une réponse.

Encore mille fois Merci!!!


"Zoury" wrote:

Salut Annie!

essai cette classe, c'est l'autre modifié un peu, j'y ai ajouté une
propriété nommé ScrollMode qui te permet de sélectionner laquelle(s) des
barres de défilement sera "linker" avec l'autre grid. :
'***
Option Explicit On

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

<Flags()> _
Public Enum ScrollModes
NotSet = 0
Horizontal = 1
Vertical = 2
Both = 3
End Enum

Public Class LinkableDataGrid
Inherits DataGrid

' attributs
Private _eScrollMode As ScrollModes
Private _dgLinkedGrid As LinkableDataGrid

' variables
Private _bLinkedGridIsChanging As Boolean
Private _bScrollModeIsChanging As Boolean
Private _bIgnoreGridLinkedEvent As Boolean

<DefaultValue(ScrollModes.NotSet)> _
Public Property ScrollMode() As ScrollModes
Get
Return _eScrollMode
End Get
Set(ByVal Value As ScrollModes)
If ((Not _bScrollModeIsChanging) And (Not
_bLinkedGridIsChanging)) Then
_eScrollMode = Value
If (Not _dgLinkedGrid Is Nothing) Then
_bScrollModeIsChanging = True
_dgLinkedGrid.ScrollMode = Value
_bScrollModeIsChanging = False
End If
End If
End Set
End Property
Public Property LinkedGrid() As LinkableDataGrid
Get
Return _dgLinkedGrid
End Get
Set(ByVal Value As LinkableDataGrid)

' vérifie si une modifs est en cours
' si oui, on passe notre tour..
' cela évite la récursion infinie
' qui est causé par le fait que l'on modifie
' la propriété LinkedGrid de notre _dgLinkedGrid
' se qui déclancherait l'événement à nouveau...
If ((Not _bScrollModeIsChanging) And (Not
_bLinkedGridIsChanging)) Then

' vérifie la nouvelle valeur
' si elle est à Nothing, c'est que l'on veut délier les
grilles
' sinon, on branche les grilles ensembles..
If ((Value Is Nothing) And (Not _dgLinkedGrid Is Nothing))
Then
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Nothing
_bLinkedGridIsChanging = False
_dgLinkedGrid = Nothing
ElseIf (Not _dgLinkedGrid Is Value) Then
_dgLinkedGrid = Value
_bLinkedGridIsChanging = True
_dgLinkedGrid.LinkedGrid = Me
_bLinkedGridIsChanging = False
_dgLinkedGrid.HorizScrollValue = Me.HorizScrollValue
_dgLinkedGrid.VertScrollValue = Me.VertScrollValue
_dgLinkedGrid.ScrollMode = _eScrollMode
End If

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 _bIgnoreGridLinkedEvent) Then
MyBase.GridHScrolled(sender, se)
If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
ScrollModes.Horizontal) = ScrollModes.Horizontal)) Then
_dgLinkedGrid.HorizScrollValue = se.NewValue
_bIgnoreGridLinkedEvent = True
_dgLinkedGrid.GridHScrolled(sender, se)
_bIgnoreGridLinkedEvent = False
End If
End If
End Sub
Protected Overrides Sub GridVScrolled(ByVal sender As Object, ByVal se
As System.Windows.Forms.ScrollEventArgs)
If (Not _bIgnoreGridLinkedEvent) Then
MyBase.GridVScrolled(sender, se)
If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
ScrollModes.Vertical) = ScrollModes.Vertical)) Then
_dgLinkedGrid.VertScrollValue = se.NewValue
_bIgnoreGridLinkedEvent = True
_dgLinkedGrid.GridVScrolled(sender, se)
_bIgnoreGridLinkedEvent = False
End If
End If
End Sub

End Class
'***

dans ton cas (tu ne veux pas du scroll du bas), utilise ScrollModes.Vertical
:O)

--
Cordialement
Yanick
MVP pour Visual Basic
"Annie L." a écrit dans le message de
news:
> Ça fonctionne très bien!
> Mais j'ai un autre problème que j'ai oublié de te parler!
> Ce que j,essaie de faire, est un peu comme dans Excel. Geler une colonne
> (ex.: dans datagrid_heures = seulement les heures de rendez-vous. Dans
> datagrid_rendez-vous = chaque colonne est égale à un employé, donc
plusieurs
> colonnes.)
> Jusqu'à date cela fonctionne très bien.
> Mais lorsque je fais défiler le 'scroll' du bas (horiz.), il ne faut pas
> qu'il fasse défiler l'autre datagrid (heures). Présentement, c'est ce
qu'il
> fait et cela 'plante' le programme. Il faudrait 'désactiver' le scroll du
> bas. J'ai essayé de mettre en commentaires la propriété de ce 'scroll' et

> cela me génère des erreurs avant la compilation!
>
> Que me suggère-tu? Merci! on approche du but recherché!
>
> "Zoury" wrote:
>
> > > Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3
à 4
> > > compilation, il me génère une erreur "La référence d'objet n'est pas
> > définie
> > > à une instance d'un objet"
> >
> >
> > Le générateur de code a mit à jour sa section de code et a ajouté les
lignes
> > suivantes :
> > '***
> > Me.dgdCarnetRV.LinkedGrid = Nothing
> > Me.dgdCarnetHeures.LinkedGrid = Nothing
> > '***
> > ce qui fesait planter le code.
> >
> >
> >
> > > J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le
form.,
> > la
> > > propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix
> > dans
> > > la liste qui s'ouvre avec comme choix les 2 datagrid.
> > >
> > > Je dois faire quelque chose de pas correct!!!!
> >
> > mmm.. ici je peux sélectionner les grilles. vérifie si, après la
> > modification proposée dans l'autre message, tu obtiens toujours le même
> > résultat. sinon on cherchera pourquoi.. :O)
> >
> >
> > --
> > Cordialement
> > Yanick
> > MVP pour Visual Basic
> >
> >
> >





Avatar
Annie L.
J'ai trouvée!!!!
Dans mon Form_Load(), j'écris :

Me.dgdCarnetHeures.LinkedGrid = Me.dgdCarnetRV
Me.dgdCarnetRV.ScrollMode = 2

Il ne me reste à régler le problème de ma dernière ligne du datagrid qui
reste cachée en arrière du ' scroll' en bas du datagrid principal!!!

Encore une fois un gros merci!
P.S. En parlant de créer des propriétés pour un contrôle, j'ai mis un autre
'Post' ayant comme titre :
"Transparence d'un bouton"
J'ai déjà essayé de créer une propriété 'TransparentKey' comme un formulaire
pour faire différentes formes de bouton et cela n'as pas fonctionné. Si tu
peut m'apporter ton aide, ça serait le bienvenue! Merci encore une fois



"Annie L." wrote:

Bonjour!!!
Wow! super! mais je ne saisie pas le "scrollModes". Présentement j'ai 2
nouvelles propriétés 'HorizScrollValue' et 'VertScrollValue' qui ont comme
valeur "0". Si je change ces propriétés soit à "1" ou "2", j'obtient un
message me disant que la valeur saisie n'est pas correcte.

En Éxécutant mon application, le 'scroll' du bas n'affecte pas l'autre
datagrid. C'est parfait, mais complexe comme programmation!!!
Mais le 'scroll' vertical ne fonctionne pas. J'aimerais savoir comment
appliquer le 'ScrollModes'.

Autre chose que j'ai remarqué hier! Quand je 'scroll' verticalement, cela
fonctionne très bien. Mais je n'arrive pas à pouvoir cliquer sur ma dernière
ligne et si j'arrive à cliquer sur la fraction de ligne que je vois, il
bousille les coordonnées de ma ligne à cause du 'scroll' du bas qui cache au
3/4 ma ligne parce que j'ai plusieurs colonnes. Mais si j'ai 3 à 4 colonnes
par exemple, tout est correct car il n'y a pas de 'scroll' dans le bas. Je
trouverai bien une solution! Tu m'as apportée une aide incroyable et je t'en
remercie grandement et j'espère que d'autres programmeurs auront suivi le
déroulement de cette fonctionnalité et qui servira à développer d'autres
classes.
Ce sont des exemples que nous ne retrouvons pas dans des livres (et j'en ai
plusieurs)!
Cela faisait plus d'un mois que je renvoyait mon 'Post' sur le site et enfin
une réponse.

Encore mille fois Merci!!!


"Zoury" wrote:

> Salut Annie!
>
> essai cette classe, c'est l'autre modifié un peu, j'y ai ajouté une
> propriété nommé ScrollMode qui te permet de sélectionner laquelle(s) des
> barres de défilement sera "linker" avec l'autre grid. :
> '***
> Option Explicit On
>
> Imports System.Runtime.InteropServices
> Imports System.Windows.Forms
> Imports System.ComponentModel
>
> <Flags()> _
> Public Enum ScrollModes
> NotSet = 0
> Horizontal = 1
> Vertical = 2
> Both = 3
> End Enum
>
> Public Class LinkableDataGrid
> Inherits DataGrid
>
> ' attributs
> Private _eScrollMode As ScrollModes
> Private _dgLinkedGrid As LinkableDataGrid
>
> ' variables
> Private _bLinkedGridIsChanging As Boolean
> Private _bScrollModeIsChanging As Boolean
> Private _bIgnoreGridLinkedEvent As Boolean
>
> <DefaultValue(ScrollModes.NotSet)> _
> Public Property ScrollMode() As ScrollModes
> Get
> Return _eScrollMode
> End Get
> Set(ByVal Value As ScrollModes)
> If ((Not _bScrollModeIsChanging) And (Not
> _bLinkedGridIsChanging)) Then
> _eScrollMode = Value
> If (Not _dgLinkedGrid Is Nothing) Then
> _bScrollModeIsChanging = True
> _dgLinkedGrid.ScrollMode = Value
> _bScrollModeIsChanging = False
> End If
> End If
> End Set
> End Property
> Public Property LinkedGrid() As LinkableDataGrid
> Get
> Return _dgLinkedGrid
> End Get
> Set(ByVal Value As LinkableDataGrid)
>
> ' vérifie si une modifs est en cours
> ' si oui, on passe notre tour..
> ' cela évite la récursion infinie
> ' qui est causé par le fait que l'on modifie
> ' la propriété LinkedGrid de notre _dgLinkedGrid
> ' se qui déclancherait l'événement à nouveau...
> If ((Not _bScrollModeIsChanging) And (Not
> _bLinkedGridIsChanging)) Then
>
> ' vérifie la nouvelle valeur
> ' si elle est à Nothing, c'est que l'on veut délier les
> grilles
> ' sinon, on branche les grilles ensembles..
> If ((Value Is Nothing) And (Not _dgLinkedGrid Is Nothing))
> Then
> _bLinkedGridIsChanging = True
> _dgLinkedGrid.LinkedGrid = Nothing
> _bLinkedGridIsChanging = False
> _dgLinkedGrid = Nothing
> ElseIf (Not _dgLinkedGrid Is Value) Then
> _dgLinkedGrid = Value
> _bLinkedGridIsChanging = True
> _dgLinkedGrid.LinkedGrid = Me
> _bLinkedGridIsChanging = False
> _dgLinkedGrid.HorizScrollValue = Me.HorizScrollValue
> _dgLinkedGrid.VertScrollValue = Me.VertScrollValue
> _dgLinkedGrid.ScrollMode = _eScrollMode
> End If
>
> 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 _bIgnoreGridLinkedEvent) Then
> MyBase.GridHScrolled(sender, se)
> If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
> ScrollModes.Horizontal) = ScrollModes.Horizontal)) Then
> _dgLinkedGrid.HorizScrollValue = se.NewValue
> _bIgnoreGridLinkedEvent = True
> _dgLinkedGrid.GridHScrolled(sender, se)
> _bIgnoreGridLinkedEvent = False
> End If
> End If
> End Sub
> Protected Overrides Sub GridVScrolled(ByVal sender As Object, ByVal se
> As System.Windows.Forms.ScrollEventArgs)
> If (Not _bIgnoreGridLinkedEvent) Then
> MyBase.GridVScrolled(sender, se)
> If ((Not _dgLinkedGrid Is Nothing) And ((_eScrollMode And
> ScrollModes.Vertical) = ScrollModes.Vertical)) Then
> _dgLinkedGrid.VertScrollValue = se.NewValue
> _bIgnoreGridLinkedEvent = True
> _dgLinkedGrid.GridVScrolled(sender, se)
> _bIgnoreGridLinkedEvent = False
> End If
> End If
> End Sub
>
> End Class
> '***
>
> dans ton cas (tu ne veux pas du scroll du bas), utilise ScrollModes.Vertical
> :O)
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
> "Annie L." a écrit dans le message de
> news:
> > Ça fonctionne très bien!
> > Mais j'ai un autre problème que j'ai oublié de te parler!
> > Ce que j,essaie de faire, est un peu comme dans Excel. Geler une colonne
> > (ex.: dans datagrid_heures = seulement les heures de rendez-vous. Dans
> > datagrid_rendez-vous = chaque colonne est égale à un employé, donc
> plusieurs
> > colonnes.)
> > Jusqu'à date cela fonctionne très bien.
> > Mais lorsque je fais défiler le 'scroll' du bas (horiz.), il ne faut pas
> > qu'il fasse défiler l'autre datagrid (heures). Présentement, c'est ce
> qu'il
> > fait et cela 'plante' le programme. Il faudrait 'désactiver' le scroll du
> > bas. J'ai essayé de mettre en commentaires la propriété de ce 'scroll' et
> là
> > cela me génère des erreurs avant la compilation!
> >
> > Que me suggère-tu? Merci! on approche du but recherché!
> >
> > "Zoury" wrote:
> >
> > > > Où est mon problème. Je sais qu'il fonctionnait correctement. Après 3
> à 4
> > > > compilation, il me génère une erreur "La référence d'objet n'est pas
> > > définie
> > > > à une instance d'un objet"
> > >
> > >
> > > Le générateur de code a mit à jour sa section de code et a ajouté les
> lignes
> > > suivantes :
> > > '***
> > > Me.dgdCarnetRV.LinkedGrid = Nothing
> > > Me.dgdCarnetHeures.LinkedGrid = Nothing
> > > '***
> > > ce qui fesait planter le code.
> > >
> > >
> > >
> > > > J'ai remarqué aussi que dans les propriétés des 2 datagrid sur le
> form.,
> > > la
> > > > propriété 'LinkedGrid' y apparaît mais il ne veut pas prendre un choix
> > > dans
> > > > la liste qui s'ouvre avec comme choix les 2 datagrid.
> > > >
> > > > Je dois faire quelque chose de pas correct!!!!
> > >
> > > mmm.. ici je peux sélectionner les grilles. vérifie si, après la
> > > modification proposée dans l'autre message, tu obtiens toujours le même
> > > résultat. sinon on cherchera pourquoi.. :O)
> > >
> > >
> > > --
> > > Cordialement
> > > Yanick
> > > MVP pour Visual Basic
> > >
> > >
> > >
>
>
>


1 2