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

eguignier 5 Messages postés lundi 6 novembre 2000Date d'inscription 1 septembre 2012 Dernière intervention - 31 août 2012 à 18:06 - Dernière réponse : krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention
- 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 

Votre réponse

3 réponses

Meilleure réponse
eguignier 5 Messages postés lundi 6 novembre 2000Date d'inscription 1 septembre 2012 Dernière intervention - 1 sept. 2012 à 09:28
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 !!

Merci eguignier 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de eguignier
Whismeril 12029 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 septembre 2018 Dernière intervention - 1 sept. 2012 à 11:04
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 3 sept. 2012 à 15:53
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.