PhilOctet Posté(e) le 16 septembre 2011 Posté(e) le 16 septembre 2011 Bonjour, je sais que ce n'est pas le lieu pour débattre de ce genre de problème mais j'ai fouillé un peu partout et je n'ai pas trouvé d'aide. Et comme j'en ai besoin, je me permet cette largesse. J'ai un treeview de type :- animaux- - chien- - chat- - souris- VIP- - Astérix- - Obélix- - Falbala Puis une listview de plusieurs colonnes en partie renseignée.VIP | compagnonAstérix.| ObélixFalbala.| ... Obélix..| ............ | souris Depuis le treeview, j'aimerai faire glisser la copie d'un item choisi vers l'un des champs de la listview.Par exemple, si je veux compléter la champs "compagnon" de la ligne "Obélix", je vais récupérer "chien" du treeview et le faire glisser vers la ligne "Obélix" de la listview. Est-ce l'un d'entre vous pourrait me transmettre un bout de code qui me bloquerait ? merci.
Invité Patrick Posté(e) le 16 septembre 2011 Posté(e) le 16 septembre 2011 Ca, c'est un job pour un spécialiste d'Astérix... :(rires forts):
(gile) Posté(e) le 16 septembre 2011 Posté(e) le 16 septembre 2011 Salut, MSDN est ton ami :http://support.microsoft.com/kb/307966http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.dragenter%28v=vs.71%29.aspxhttp://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.dragdrop%28v=vs.71%29.aspx Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 17 septembre 2011 Posté(e) le 17 septembre 2011 Un petit exemple avec un contrôle TreeView nommé treeView et contrôle ListView nommé listView. Pour faire un glisser déposer entre deux contrôles, il faut :- que le contrôle cible ait la propriété AllowDrop = true ;- utiliser la méthode DoDragDrop ;- gérer les évènements DragEnter et DragDrop du contrôle cible. On peut utiliser l'évènement MouseMove du contrôle source (le TreeView) pour lancer la méthode DoDragDrop si le bouton gauche est maintenu enfoncé.L'évènement DragEnter du contrôle cible (ListView) se déclenche quand le curseur entre dans le contrôle on vérifie à ce moment que la donnée à glisser/déposer est bien du type requis (ici String) ce qui a pour effet de modifier (ou non) le curseur.Pour l'évènement DragDrop (quand le bouton gauche de la souris est relâché) il va être nécessaire de déterminer sa position dans le contrôle pour copier la donnée dans le bon élément (ou sous élément) de la liste ou de l'ajouter en fin de liste si le curseur est placé au delà du dernier élément.Contrairement aux contrôles ListBox, les controles ListView n'ont pas de méthode IndexFromPoint qui retourne l'indice de l'élément dans la liste en fonction d'un point exprimé dans le système de coordonnées du contrôle, il faut donc en définir une. Il faut aussi, toujours en fonction de la position du curseur au moment du largage, déterminer dans quelle colonne copier le texte. using System.Drawing; using System.Windows.Forms; namespace DragAndDropSample { public partial class DragAndDrop : Form { public DragAndDrop() { InitializeComponent(); listView.AllowDrop = true; } // lance DoDragDrop si la souris bouge avec le bouton gauche enfoncé dans le contrôle treeView private void treeView_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DoDragDrop(treeView.SelectedNode.Text, DragDropEffects.Copy); } } // quand la souris entre dans le ListView, si la donnée est de type String, // l'effet sera : Copier, sinon aucun effet private void listView_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } } // la donnée est copiée en fonction de la position du curseur dans le contrôle ListView private void listView_DragDrop(object sender, DragEventArgs e) { // conversion de la donnée en String string str = (string)e.Data.GetData(typeof(System.String)); // conversion de la position du curseur (coordonnées écran) en coordonnées contrôle Point clientPoint = listView.PointToClient(new Point(e.X, e.Y)); // calcul de l'indice de l'élement sous le curseur int index = IndexFromPoint(clientPoint); // le curseur est au delà de la liste if (index == -1) { ListViewItem newItem; // première colonne if (clientPoint.X < listView.Columns[0].Width) { newItem = new ListViewItem(new string[] { str, "" }); } // deuxième colonne else { newItem = new ListViewItem(new string[] { "", str }); } // ajout du nouvel élément listView.Items.Add(newItem); } // il y a un élément à l'indice trouvé else { // élément à l'indice trouvé ListViewItem lvi = listView.Items[index]; // première colonne if (clientPoint.X < listView.Columns[0].Width) { lvi.Text = str; } // deuxième colonne else { listView.Items[index] = new ListViewItem(new string[] { lvi.Text, str }); } } } // retourne l'indice de l'élément sous le curseur ou -1 si le curseur est au delà de la liste existante. private int IndexFromPoint(Point pt) { int index = pt.Y / listView.Items[0].Bounds.Height - 1; if (index < listView.Items.Count) { return index; } else { return -1; } } } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant