DragDrop sur Datagridview

Résolu
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
- 30 août 2008 à 14:14
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008
- 10 sept. 2008 à 13:49
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

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

2 sept. 2008 à 16:13
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+
3
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

31 août 2008 à 00:16
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
0
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
31 août 2008 à 09:17
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 +
0
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

1 sept. 2008 à 12:24
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
1 sept. 2008 à 15:11
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é.
0
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

1 sept. 2008 à 22:13
Bonsoir,

as tu tester la dernier version si dessus.?

car je n'ai pas ce probleme.

A+
0
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
1 sept. 2008 à 22:51
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 +
0
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

2 sept. 2008 à 06:14
bonjour,

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

A+
0
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
2 sept. 2008 à 08:28
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 +
0
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

2 sept. 2008 à 12:16
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+
0
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
2 sept. 2008 à 12:28
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 +
0
Zayann
Messages postés
75
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
15 juillet 2015
1
10 sept. 2008 à 12:41
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...
0
kinneri
Messages postés
44
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 septembre 2008

10 sept. 2008 à 13:49
Bonjour,

il n'y a pas de souci.


A bientot


 
0