DragDrop entre 2 treeview : noeud copié 4 fois [Résolu]

Messages postés
5
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
1 septembre 2012
- - Dernière réponse : krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
- 3 sept. 2012 à 15:53
Bonjour à tous,

Je travaille avec le Visual C# Express 2010.
Je souhaite pouvoir déplacer des nœuds d'un treeview à un autre.

Pas de soucis d'un treeview sur lui même. Ca marche.
Par contre, d'un treeview à un autre, le drag & drop fonctionne mais le nœud est dupliqué 4 fois !!!!

Pour la mise en oeuvre et le codage, j'ai exactement utilisé la démarche préconisée à l'adresse suivante : http://support.microsoft.com/kb/307968

Dommage de ne pas pouvoir vous joindre le projet en pièce jointe : ça aurait été plus simple.
Je mets le code ci-dessous.

Pourriez-vous m'indiquer d'où pourrait provenir le problème ??
Avec tous mes remerciements.

----------------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Drap_Drop_2_TreeView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
TreeNode ParentNode1;
TreeNode ParentNode2;

ParentNode1 = treeView1.Nodes.Add("tv1");
ParentNode1.Nodes.Add("tv1FirstChild");
ParentNode1.Nodes.Add("tv1SecondChild");
ParentNode1.Nodes.Add("tv1ThirdChild");
ParentNode1.Nodes.Add("tv1FourthChild");
ParentNode1.Expand();

ParentNode2 = treeView2.Nodes.Add("tv2");
ParentNode2.Nodes.Add("tv2FirstChild");
ParentNode2.Nodes.Add("tv2SecondChild");
ParentNode2.Expand();

this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
}

private void treeView_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}

private void treeView_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}


private void treeView_DragDrop(object sender, DragEventArgs e)
{
TreeNode NewNode;

if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
if (DestinationNode.TreeView != NewNode.TreeView) // bascule d'un treeView à un autre seulement
{
DestinationNode.Nodes.Add((TreeNode)NewNode.Clone());
DestinationNode.Expand();
//Remove Original Node
NewNode.Remove();
}
}
}
}
}
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
5
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
1 septembre 2012
3
Merci
J'ai trouvé !!!

Je donne l'information à ceux qui pourrait se faire piéger comme moi

En fait, lorsque j'ai dessiné l'interface, j'ai utilisé la fenêtre des propriétés pour créer les fonctions événementielles (Item_Drag, DragEnter, DragDrop) comme je le fais habituellement. Mais ici, comme je testais un bout de code trouvé sur le WEB, j'ai aussi recopier le paramétrage des événements cette fois-ci installé via le code :

this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);


Donc, j'ai dupliqué sans m'en rendre compte les événements, c'est pourquoi mes noeuds se trouvaient duppliqués lors du Drap&Drop.
La solution consiste donc soit à paramétrer via l'interface Visual, soit par code, mais pas les 2 !!
J'ai donc supprimé le code ci-dessus et çà marche !!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de eguignier
Messages postés
13850
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
22 octobre 2019
312
0
Merci
Bonjour,
c'est super de mettre ta propre solution, si tu veux bien cliquer sur le bouton "Réponse Acceptée", le sujet apparaitra résolu.

Pour maximiser les chances de réponses quand tu postes un code utilise les balise de codes (3ième icône en partant de la droite : ), ça met de la couleur et garde l'indentation, c'est beaucoup plus lisible.
J'avais vu ton post hier, mais n'ai pas eu le courage de lire le code...


Whismeril
Commenter la réponse de Whismeril
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
28
0
Merci
+1 Whismeril.
@Eguignier : Pour cette fois, je coche "Réponse acceptée" pour toi, mais merci de le faire la prochaine fois.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog