DRAG DROP ENTRANT ET CLIPBOARD : MÊME COMBAT !

ley0 Messages postés 3 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 12 décembre 2006 - 12 déc. 2006 à 00:43
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 - 23 août 2007 à 19:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40575-drag-drop-entrant-et-clipboard-meme-combat

cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
23 août 2007 à 19:13
oui, je vois mieux ce que tu veux dire.
En gros, tu ne veux pas simplement déplacer un élément d'une liste à l'autre, mais prendre un élément de la liste 1 et "l'associer" à un élément de la liste 2.
Ta logique de vouloir mettre un évènement DragEnter sur un élément de la liste plutôt que sur la liste en elle-même est légitime, mais comme tu le vois, ce n'est à priori pas possible.
L'autre solution serait de récupérer l'emplacement de la souris au moment de cet évènement (cette info doit certainement se trouver dans les params de l'évènement DragEnter), et par ce biais, voir s'il n'y a pas une méthode pour savoir quel élément de la liste se trouve au niveau de ce point.
Essaye peut-être de chercher dans ce sens. Si tu le souhaites, je veux bien y regarder plus concrètement dimanche prochain ou la semaine prochaine. D'ici-là, je n'aurais malheureusement pas le temps de m'y attarder plus...
Bon coding !

a+
tibo76530 Messages postés 24 Date d'inscription mercredi 6 juin 2007 Statut Membre Dernière intervention 15 octobre 2008
23 août 2007 à 17:24
merci pour ta réponse. mais ca ne réponds pas totalement à ce que je veux.
je vais essayer de mieux expliquer.
j'ai déjà implémenter les dragenter et drag drop.
j'ai ce code la:
this.listViewTarget.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewTarget_DragDrop);
this.listViewTarget.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewTarget_DragEnter);
seulement, je ne veux pas pouvoir deposer mon élément saisi dans ma 1ere list dans ma 2eme list, mais SUR un éléments de ma 2eme liste.
j'ai essayé de mettre mes 2 fonctions sur
this.listViewTarget.Items.DragDrop

mais ca ne marche pas.
j'espère que tu as compris ce que je voulais faire, et vois tu une solution?
merci de tes conseils.
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
22 août 2007 à 12:08
Je ne sais pas si ce que je vais te dire va t'aider, mais voici comment je vois le principe :
Tout d'abor, tu as une classe, qui hérite de l'interface IDataObject (je crois que c'est son nom). C'est une interface définie dans le framework .net. Comme c'est une interface, tu dois redéfinir dans ta classe les méthodes de l'interface.
Une fois que c'est fait, tu remplis ta liste normallement avec tes données, qui doivent correspondre à des instances de ta classe qui implémente IDataObject.

Maintenant, tu dois gérer deux évènements sur tes listview :
- Sur ta liste 1 : L'évènement DragOut. Autrement dit, ce qui se passe quand l'utilisateur prend un élément de cette liste pour l'emener ailleurs. Sur cette évènement, tu peux définir le DataObject qui sera "transporté" d'un composant à l'autre. Et le DataObject en question, c'est le (ou les) instances des classes qui se trouvent derrière chaque élément sélectionné du listview. Pour voir si ton évènement DragOut fonctionne, tu peux utiliser le code présent sur cette page. Il te suffit, si tout se passe bien, de lancer ton projet, et de faire un drag&drop de ta liste 1 vers mon appli, et tu verra si ton dataobject est bien passé.

- Secondo, il faut gérer le DragEnter sur ton second listview. Autrement dit, c'est l'évènement qui survient lorsque ton utilisateur est en train de faire un drag&drop, et que sa souris arrive sur ton listview de destination, mais attention, le bouton de la souris n'est pas encore relaché. C'est à ce moment là que tu peux accepter ou non l'objet qu'on te propose. Pour accepter ou non, tu regardes les paramètres passés à ton évènement... tu y trouveras un dataobject. Il te suffit de voir si le type de ce dataobject te convient. Ici, le type sera typeof(la classe dont on a parlé tout à l'heure).

- Enfin, le DragDrop. C'est quand l'utilisateur relache la souris sur ton second ListView. C'est à ce moment précis que tu récupères effectivement ton DataObject, et que tu en fais ce que tu veux. Typiquement, ici, tu vas devoir ajouter un nouvel élément à ton second listview, et mettre à jour ta base de données.

Autre chose que je te conseille : tu as deux listview, et tu veux peut-être pouvoir faire des drag&drop de l'une vers l'autre, et vice-versa. Ce que tu devrais donc faire, c'est un composant ergonomique qui dérive de listview, et qui implémente tout ce que je t'ais dit avant. De cette mannière, tu ne réécriras pas tes évènements de drag&drop 2 fois (1 fois par listview).

Bon, je ne sais pas si tout ce que j'ai écrit est exact car j'ai fait ça de mémoire. Je n'ai peut-être pas été non plus très clair dans mes explications.

Le mieux serait que tu je te fasse un tutoriel ce soir, si tu en as besoin.

a+
tibo76530 Messages postés 24 Date d'inscription mercredi 6 juin 2007 Statut Membre Dernière intervention 15 octobre 2008
22 août 2007 à 11:45
effectivement, j'ai relu, et c'est pas très clair ce que j'ai mis. c'est effectivement un drag and drop interne que je souhaite réaliser. j'explique:
j'ai 2 listview, remplies chacunes avec des éléments différents.
je souhaite que l'on puisse prendre un élément de la premiere liste, qu'on le fasse glisser sur la 2eme et quand on le lachera sur l'élément choisi, je coderai un enregistrement dans ma BDD. voila, j'espère que c'est plus clair.
dans tous les cas, merci de t'intéresser à mon problème.
tibo
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
22 août 2007 à 09:17
Salut,

Je ne sais pas trop ce que tu veux faire, et effectivement, je veux bien des précisions.
Ceci-dit, la source présentée ici permet de gérer le drag&drop provenant d'applications tierces. Par exemple, que se passe-t-il quand on fait un drag en drop depuis excel ou word vers ton application. D'après ce que j'ai compris de ton message, il s'agirait plutôt d'un drag&drop interne. Les mêmes évènements sont les mêmes. Après, tu peux très bien effectuer des opérations (enregistrement en base par ex.) ou lever des évènements internes à ton application sur l'évènement gérant le drag "in" de teslist-box.
Pour pouvoir t'aider d'avantage, j'aurais besoin plus d'infos, avec pourquoi pas un peu de code.

Cordialement,

Yoann
tibo76530 Messages postés 24 Date d'inscription mercredi 6 juin 2007 Statut Membre Dernière intervention 15 octobre 2008
21 août 2007 à 18:15
bonjour.
ton code est très intéressant.
j'ai une queston pour toi: j'ai moi aussi un code de drag and drop sur 2 list view, pour copier les éléments de l'une vers l'autre. mais je souhaiterai changer cela. en effet, je voudrai qu'en droppant les éléments de ma 1ere liste sur ceux de la 2eme, cela déclenche un évènement qui me permettent de les associer dans ma BDD.
merci de me répondre, ou de me demander des précisions
tibo
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
12 déc. 2006 à 01:49
OK, je vois à peu près ce que tu veux dire. Première chose pour être bien clair : nous sommes ici dans un contexte d'appli windows, et non web.

Malheureusement, il n'existe pas de méthode miracle pour traiter toutes les données envoyées depuis un drag and drop.

La raison de ceci est qu'un drag and drop peut t'envoyer des données texte, image, stream, tableaux de strings, tableaux d'entiers, collections, ... bref, toutes les classes qu'il est possible de trouver dans le framework, ainsi que toutes les classes qu'il est possible de développer. Une chose est sûre, c'est à l'application dont vient le drag and drop de fournir des informations compréhensibles par les autres programmes, et pas l'inverse.

En tous cas, vu la diversité de ce qui peut t'être envoyé, j'ai créé ce petit programme. Tu fais un glisser déposer de l'appli dont tu souhaites avoir la possibilité de recevoir des données. S'il s'agit d'Excel, très bien, fais un test avec Excel, récupère par exemple la donnée au format csv par exemple, et voila, tu as géré déjà un type de compatibilité avec une application tierce. Au passage, si une autre application t'envoie aussi du csv, tu seras aussi compatible, sans rien avoir eu à faire !

Bref, il est impossible de savoir ce que tu vas récupérer, mais tu peux toujours traiter les cas les plus courants (texte, html, xml, image, stream). Pour en venir à ta question de la complexité des objets envoyés par drag and drop, la réponse est donc simple : on t'envoie tout et n'importe quoi par ce biais, aussi bien tu texte simple si tu en veux, que tu xml, du bitmap, des instances de classes avec leurs sous-classes... Peut-on être générique dans ces cas là ? Oui si on ne veut récupérer que des données texte (c'est facile, pas cher, et ça peut rapporter gros), mais certainement pas pour des trucs plus chiadés type instances de classes, memystreams, documents xml...

Voila, j'espère avoir répondu à ta question. Si j'ai mas expliqué ou que je suis à côté de la plaque, n'hésite pas à me relancer.

ps : je publierais dans quelques temps un article sur le drag and drop sortant, ou comment envoyer des données à d'autres applications...

a+
ley0 Messages postés 3 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 12 décembre 2006
12 déc. 2006 à 01:31
Excuses-moi. Je suis un commentateur emballé.

Un mashup est un "mixte" de plusieurs choses, et fait partie de notre époque. Par exemple, le scrapbooking est en quelque sorte du mashup. Certains vidéos sur iTune, les mixages de dj. Dans un contexte de programmation web, on peut appeler mashup le mélange de plusieurs sites. Par exemple, quelqu'un qui ferait un site (payant ou non) spécialisé en météorologie en réutilisant directement des informations provenant de divers sites (Weather, meteo-media, meteofrance) et en ferait soit un site web (ex: asp), soit un petit programme qui les réutiliserait pour des calculs statistiques.

Ainsi, je me demandais si cette source pouvait être utile pour ce genre de programmation. J'imaginais par exemple un programme qui permettrait de récupérer directement des formulaires et objets dans des sites pour les placer dans son propre programme, comme on effectuerait dans un environnement visuel.

Par ailleurs, et je viens de m'en souvenir, il existe déjà des sites qui propose la construction de site web - EN LIGNE - et qui imite le style IDE. Voilà pourquoi je me suis imaginé un programme plutôt "généraliste", qui saurait traiter n'importe quel objet. Ou voilà plutôt pourquoi je me demandais le niveau de complexité, sinon les types d'objets qui sont "bouffés" par le GetAllData(e.Data).
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
12 déc. 2006 à 00:54
Salut,

Il me semble que je n'ai pas bien compris le se sens de ta question.

Qu'entends-tu par "mashup" ?
ley0 Messages postés 3 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 12 décembre 2006
12 déc. 2006 à 00:43
commentaire / suggestion

À première vue, ta source semble très bien structurée. J'ai vraiment hâte de l'essayer. Puisqu'il n'est pas possible pour moi de l'essayer présentement, je me demandais à quel point les objects drag&drop-és peuvent être complexes.

Par exemple, est-il possible de prendre et glisser un élément provenant du browser, soit, une list-box, dans la perspective de faire de cette simple source la fonction principale d'une classe qui fabriquerait rapidement des mashups, puisque les documents office(c), par exemple, gèrent très bien la conversion vbscript <=­> html, si je ne m'abuse.

Merci!
Rejoignez-nous