DragDrop entre 2 treeview : noeud copié 4 fois

Résolu
eguignier Messages postés 8 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 11 juin 2020 - 31 août 2012 à 18:06
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre 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();
}
}
}
}
}

3 réponses

eguignier Messages postés 8 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 11 juin 2020
1 sept. 2012 à 09:28
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 !!
3
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
1 sept. 2012 à 11:04
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
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
3 sept. 2012 à 15:53
+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é. -
0
Rejoignez-nous