DragDrop sur Datagridview [Résolu]

Signaler
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
-
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008
-
Bonjour...

Je cherche à faire un glisser/déposer entre deux datagridview.
Avec l'aide j'ai réussi à saisir les données mais je n'arrive pas à les mettre dans mon deuxième datagridview...

   Private Sub datagridview1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
        DataGridView1.DoDragDrop(DataGridView1.Rows, DragDropEffects.Copy Or DragDropEffects.Move)
    End Sub

HELP please...

13 réponses

Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

ha bon,

c'est bizarre, je n'ai pas ce probleme.
il insere bien, la ligne demandé.
je poste ci dessous toute la source dans le cas ou tu aurais une erreur.
verifie que la zone est bien selectionné. je viens d'avoir le probleme, mais la zone n'etait pas selectionné comme il faut.
il faut faire 1 click avant sur la zone pour le selectionné.

Public

Class Form1

Dim data
As DataGridViewRow, hit

Private clickedCell
As DataGridViewCell 

Private
Sub DataGridView1_MouseDown(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles DataGridView1.MouseDown

If DataGridView1.CurrentCell.Value <>
""
ThenData = DataGridView1.Rows(DataGridView1.CurrentRow.Index).Clone()

' as DataGridViewRow;

Dim a

For i = 0
To Data.Cells.Count - 1a = DataGridView1.CurrentRow.Cells(i).Value

data.Cells(i).Value = a

DataGridView2.DoDragDrop(data, DragDropEffects.Copy)

Next

End
If

End
Sub

Private
Sub DataGridView2_DragDrop(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragDrop
'ByVal e As System.Windows.Forms.DragEventArgs

Dim clientPoint
As Point = DataGridView2.PointToClient(
New Point(e.X, e.Y))

Dim hit
As DataGridView.HitTestInfo = DataGridView2.HitTest(clientPoint.X, clientPoint.Y)

If hit.RowIndex <> -1
ThenDataGridView2.Rows.Insert(hit.RowIndex, data)

ElseDataGridView2.Rows.Add(data)

End
If

End
Sub

Private
Sub DataGridView2_DragOver(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragOvere.Effect = DragDropEffects.Copy

End
Sub

End

Class

A+
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

bonsoir

voila une façon de faire un drag drop vers un datagrid

A+

Public IndexdInsertion
As
Integer

Private
Sub DataGridView1_MouseDown(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles DataGridView1.MouseDown

If DataGridView1.CurrentCell.Value <>
""
ThenDataGridView1.DoDragDrop(DataGridView1.CurrentCell.Value, DragDropEffects.Copy

Or DragDropEffects.Move)

End
If

End
Sub

Private
Sub DataGridView2_DragOver(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragOver

Dim aa =

GetType(System.String)

If
Not (e.Data.GetDataPresent(
GetType(System.String)))
Thene.Effect = DragDropEffects.None

Elsee.Effect = DragDropEffects.Copy

End
If

End
Sub

Private
Sub DataGridView2_DragDrop(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragDrop

Dim item
As
Object =
CType(e.Data.GetData(
GetType(System.String)), System.Object)DataGridView2.Rows.Insert(IndexdInsertion, item)

End
Sub
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Merci beaucoup...

Deux petits problèmes...

La copie ne s'effectue que sur une des colonnes... Mes datagridview contiennent deux colonnes, une nom et une nombre.
Seul la colonne du nom se copie...

Autre petit problème il y a un décalage entre la sélection et le copie, je m'explique...
je dragdrop l'item 1, pas de problème.
je dragdrop l'item 2, nouvelle copie de l'item 1
je dragdrop l'item 3, copie de l'item 2
je dragdrop l'item 4, copie de l'item 3

Dans le désordre, l'ordre que je choisi est bien respecté mais le code copie systématiquement l'item 1 en premier...

Merci déja pour le code, c'est plus que ce que j'avais pu faire...
je vais le regarder en détaille

A +
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

Bonjour,

voici une methode pour dragdrop multi colonne

Public

Class Form1

Dim data
As DataGridViewRow

Private
Sub DataGridView1_MouseDown(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles DataGridView1.MouseDown

If DataGridView1.CurrentCell.Value <>
""
ThenData = DataGridView1.Rows(DataGridView1.CurrentRow.Index).Clone()

' as DataGridViewRow;

Dim a

For i = 0
To Data.Cells.Count - 1a = DataGridView1.CurrentRow.Cells(i).Value

data.Cells(i).Value = a

DataGridView2.DoDragDrop(data, DragDropEffects.Copy)

Next

End
If

End
Sub

Private
Sub DataGridView2_DragOver(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragOvere.Effect = DragDropEffects.Copy

End
Sub

Private
Sub DataGridView2_DragDrop(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragDrop

Dim clientPoint = DataGridView2.PointToClient(
New Point(e.X, e.Y))

Dim hit = DataGridView2.HitTest(e.X, e.Y)

If hit.RowIndex <> -1
ThenDataGridView2.Rows.Insert(hit.RowIndex, data)

ElseDataGridView2.Rows.Add(data)

End
If

End
SubEnd

Class

A+
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Merci beaucoup, ça marche nickel, sauf le problème avec l'ordre de sélection...

En debuggant j'ai compris pourquoi...
la cellule par défaut est la cellule 0...
Or la routine de copie :

PrivateSub DataGridView1_MouseDown(
ByVal sender
AsObject,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles DataGridView1.MouseDown
If DataGridView1.CurrentCell.Value <>
""ThenData = DataGridView1.Rows(DataGridView1.CurrentRow.Index).Clone()

' as DataGridViewRow;Dim a
For i = 0
To Data.Cells.Count - 1a = DataGridView1.CurrentRow.Cells(i).Value

data.Cells(i).Value = a

DataGridView2.DoDragDrop(data, DragDropEffects.Copy)

NextEndIfEndSub

met la cellule sélectionnée comme active que lors de la sortie de la routine...
Lors de la sélection, la routine active est toujours la précédente, tant que le bouton n'est pas relâché.
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

Bonsoir,

as tu tester la dernier version si dessus.?

car je n'ai pas ce probleme.

A+
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Bonsoir...

Oui elle a été testé et fonctionne très bien, encore merci....

C'est vraiment un problème de focus sur la cellule...
la cellule choisie prend le focus mais à la fin de la procédure, le dragdrop se fait donc sur la cellule précédente - qui a encore le focus - ou sur la cellule 0 par défaut.

J'ai essayé de forcé le focus lorsque la souris passe sur une cellule mais cela n,e fonctionne pas...
Je vais refaire des test demain...

A +
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

bonjour,

ok, je vais voir pour qu'il se place a l'endroit ou la souris depose.

A+
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Bonjour,
J'ai refait des test ce matin...

Effectivement, le focus devient actif sur la cellule voulue au moment du relâchement du bouton de la souris...
La seul solution que j'entrevoie est donc de donner le focus à la cellule lorsqu'elle est survolée par la souris (sans clic donc), peut être par un évennement : DataGridView1.CellMouseEnter...

Je vais encore essayé cette solution (hier soir c'était pas vraiment une réussite)...

A +
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

Bonjour,

colle ce code


Private
Sub DataGridView2_DragDrop(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.DragEventArgs)
Handles DataGridView2.DragDrop
'ByVal e As System.Windows.Forms.DragEventArgs









Dim

clientPoint


As

Point = DataGridView2.PointToClient(


New

Point(e.X, e.Y))



Dim

hit


As

DataGridView.HitTestInfo = DataGridView2.HitTest(clientPoint.X, clientPoint.Y)



If

hit.RowIndex <> -1


Then


DataGridView2.Rows.Insert(hit.RowIndex, data)








Else


DataGridView2.Rows.Add(data)








End





If








End





Sub

cela devrait resoudre ton probleme.

A+
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Merci mais, le problème viens de datagridview1, pas de datagridview2...

Je n'ai pas du bien expliquer...

Le problème n'est pas à l'insertion de la ligne mais à la saisie dans le datagridview1,...

Merci quand même pour la réponse rapide, je vais regarder en détail ton code...

A +
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
Bonjour...

Désolé pour la réponse tardive... Petits problèmes de système...

Effectivement, ça marche bien, j'ai du faire quelques erreurs...
Merci pour tout...

A bientôt peut -être...
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

Bonjour,

il n'y a pas de souci.


A bientot