IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] RichTextBox et glisser/déposer de fichier


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut [C#] RichTextBox et glisser/déposer de fichier
    Salut,

    J'ai une application avec une RichTextBox. Dedans je veux faire un glisser/déposer d'un fichier et en récupérer le path.

    Je sais faire un glisser/déposer de texte à partir de wordpad par exemple. Là où je bloque c'est pour récupérer le path de mon fichier lors du glisser/déposer.

    Quelqu'un peut-il m'aider ?

    Merci.

    ++

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    J'ai trouvé un exemple en VB sur MSDN, je l'ai adapté à mon application mais je n'y arrive pas...

    Voici le lien : http://msdn.microsoft.com/library/de...mpDragDrop.asp

    Et voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private void richTextBox_firmware_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.FileDrop))
       {
          e.Effect = DragDropEffects.All;
       }
    }
     
    private void richTextBox_firmware_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.FileDrop))
       {
          string hex_source_file = "" + e.Data.GetData(DataFormats.FileDrop);
          richTextBox_messages.AppendText(hex_source_file);
       }
    }

  3. #3
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Plus de précision STP, tu n'arrives pas à quoi ?
    Qu'est ce qui ne marche pas exactement ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Tout simplement récupérer le path du fichier que je dépose dans ma richTextBox par glisser/déposer...

    ++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Personne ne peut m'aider ?

    Je suis sûr que ce n'est pas grand chose mais là je ne trouve vraiment pas

    ++

  6. #6
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Je veux bien t'aider, mais va falloir me parler comme un développeur et pas comme à un grand-gourou-qui-va-magiquement-comprendre-mon-problême-et-me-donner-la-réponse-à-la-question-que-je-n-ai-pas-posée.

    Je réitère :
    Plus de précision STP, tu n'arrives pas à quoi ?
    Qu'est ce qui ne marche pas exactement DANS TON CODE ?

    Quel résultat as-tu avec ce que tu as publié ?
    Quel résultat attendais-tu ?
    Quelle est la question précise que tu veux poser qui te débloquerait ?

    "Ca marche pas", c'est mes clients que me disent ça, et ils me payent pour que je me démerde avec ça. Et je passe plus de temps à essayer de comprendre leur problème qu'à le résoudre.
    Ici c'est un forum d'aide aux développeur, et pas consulting-gratos.fr

    (Dsl, je suis pas très agréable le vendredi. Fin de semaine. Fatigué)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Désolé mais ça me paraît pourtant clair : je veux juste récupérer le path du fichier déposé dans ma richTextBox.

    Un exemple :
    - d'un côté mon appli et sa richTextBox, de l'autre un fichier du disque dur
    - l'utilisateur fait glisser un fichier depuis l'explorateur windows vers la richTextBox et le dépose
    - je récupère le path du fichier et je le stocke dans une variable.

    Pour l'instant avec le code que j'ai déjà déposé plus haut, j'arrive à récupérer l'evénement DragDrop dans ma richTextBox qui intervient lorsque je dépose le fichier. Mais je ne sais pas comment en récupérer le path.

    Je veux bien croire que ce n'est pas toujours facile à comprendre mais je n'ai pas écris comme si je m'adressais à un
    grand-gourou-qui-va-magiquement-comprendre-mon-problême-et-me-donner-la-réponse-à-la-question-que-je-n-ai-pas-posée
    : j'ai décris ce que je voulais faire, j'ai mis un morceau de mon code pour illustrer et même si apparemment ça ne suffit pas.

    ++

  8. #8
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Ouaip, c'est vendredi, chui fatigué, mais toi non plus tu veux pas comprendre :

    Reprenons : dans ton code, le if(e.Data.GetDataPresent(DataFormats.FileDrop))
    Il te retourne vrai ou faux ?

    Si vrai => alors il faut maintenant utiliser e.Data.GetFormats.
    Ca retourne un tableau de chaines de caractères.
    Tu les affiches, et dedans tu verras qu'il y en a une qui t'intéresse.

    Il te reste à faire e.Data.GetData(le-format-que-tu-as-choisis)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Salut,

    Le if(e.Data.GetDataPresent(DataFormats.FileDrop)) me retourne vrai.

    Ensuite je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string[] youyou = (e.Data.GetFormats(true));
    foreach (string boboche in youyou)
    {
    	richTextBox_messages.AppendText(boboche + "\n");
    }
    Voici ce que ça m'affiche :
    Shell IDList Array
    Shell Object Offsets
    DragImageBits
    DragContext
    InShellDragLoop
    FileDrop
    FileNameW
    FileName

    Donc moi je veux récupérer le FileName alors je dois faire e.Data.GetData(le-format-que-j'ai-choisi), mais justement le format que je choisi, je dois mettre quoi ? J'ai vu des exemples avec "System.String" mais ce n'est pas ça qui me donne mon FileName

    En tout cas merci de prendre du temps pour m'aider...

    ++

  10. #10
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Je vais te laisser deviner toi même :

    * Ca retourne quoi GetFormats ?
    * Ca peut prendre quoi en paramètre GetDataPresent ?

    Pour être sûr qu'on se comprend :
    * System.String c'est le nom d'un Type (on l'appelle aussi, plus simplement, string, et on peut utiliser indifféremment les deux noms)
    * "robert" c'est une instance de Type System.String
    * "robert".GetType() ça te retourne le Type nommé System.String, exactement le même que celui retourné pas typeof(System.String)

    Dsl, je suis chiant, je n'aime pas donner la solution directe, je préfère expliquer

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    * Ca retourne quoi GetFormats ?
    Des chaînes de caractères avec les infos sur ce qu'on a déposé

    * Ca peut prendre quoi en paramètre GetDataPresent ?
    Le type de données qu'on attend à l'issue du déposer, ici mon fichier.

    Pour être sûr qu'on se comprend :
    * System.String c'est le nom d'un Type (on l'appelle aussi, plus simplement, string, et on peut utiliser indifféremment les deux noms)
    * "robert" c'est une instance de Type System.String
    * "robert".GetType() ça te retourne le Type nommé System.String, exactement le même que celui retourné pas typeof(System.String)
    ça j'ai compris, juste le GetType qu eje n'ai jamais utilisé.

    Mais en fait il faut que j'accède au contenu de la chaîne FileName , c'est là que je bloque...
    Dsl, je suis chiant, je n'aime pas donner la solution directe, je préfère expliquer
    C'est pour mon bien

  12. #12
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Biiiiiiiiiiiiiiiiiiiiiipp mauvaise réponse :

    GetDataPresent à trois surcharges :
    * une avec une string
    * une avec un type
    * une avec une chaine et un booléen

    Toi tu veux récupérer quoi ? un nom de fichier.
    Et dans le drag 'n drop il y a quoi ?
    Bah t'en sais rien et moi non plus !

    Donc déjà, l'appel avec un Type, il sert à rien pask'on sait pas ce qu'on doit récupérer.
    Dans les formats, il y avais deux qui était vachement intéressants :
    * FileNameW
    * FileName

    Or ces formats, ce sont quoi ? Des chaînes !!
    Bon... j'ai l'impression de dire des évidence, mais si tu récupère un format qui est une chaine et que GetDataPresent prend une chaine en paramètre... tu penses pas qu'il pourrais y avoir un lien ?

    Si tu as encore un doute, va jeter un oeil sur la doc de GetDataPresent.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Alors le GetDataPresent de "FileName" me retourne "true", si je ne m'abuse ça veut dire qu'il y a bien un nom de fichier.

    Donc ensuite je dois faire un GetData de "FileName", c'est ça ?
    Mais apparemment ça ne me récupère pas mon nom de fichier, du moins ma chaîne dans laquelle je le récupère est vide...

    Là je tourne vraiment en rond, j'ai des exemples que je n'arrive pas à faire fonctionner, je suis tes explications mais je n'ai pas de résultat.

    Peux-tu me dire si ce que je fais est correct :
    - je regarde que j'ai bien un fichier qui entre dans la RichTextBox au DragEnter avec GetDataPresent(DataFormats.FileDrop)
    - je vérifie que j'ai un nom de fichier avec le GetDataPresent("FileName") au DragDrop
    - je fais un GetData("FileName") pour récupérer le nom de fichier

    Qu'est ce qui ne va pas ?

    Merci encore.

    ++

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    J'ai réussi, mais pas tout à fait comme tu m'as dit Mose...

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    /***************************************************************
    * DRAG & DROP D'UN FICHIER
    ***************************************************************/
    private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.FileDrop))
       {
          e.Effect = DragDropEffects.Copy;
       }
    }
     
    private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent("FileName"))
       {
          Array DroppedFile = (Array)e.Data.GetData(DataFormats.FileDrop);
          String FileName = DroppedFile.GetValue(0).ToString();
       }
    }
    C'était dans ce sens que tu m'orientais ?

    ++

    Edit : je ne fais plus le drag & drop dans ma richTextBox mais dans ma form

  15. #15
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Yep, c'est bien.

    Deux remarques :

    - Je comprend pas pourquoi tu fais if (e.Data.GetDataPresent(DataFormats.FileDrop)) dans le DragEnter et if (e.Data.GetDataPresent("FileName")) dans le DoDragDrop. Par soucis de cohérence (d'homogénéité), tu devrais n'utiliser qu'une seule des deux formes.

    - Tu récupère un Array et tu fais du GetValue alors que plus simplement tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // on récupère un tableau de noms de fichier
    string[] droppefiles = (string[])e.Data.GetData(DataFormats.FileDrop);
    // on ne s'intéresse qu'au premier nom de fichier
    string firstfilename = droppefiles[0];
    Je trouve ça plus lisible, mais bon... c'est une question de point de vue

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Citation Envoyé par Mose
    - Je comprend pas pourquoi tu fais if (e.Data.GetDataPresent(DataFormats.FileDrop)) dans le DragEnter et if (e.Data.GetDataPresent("FileName")) dans le DoDragDrop. Par soucis de cohérence (d'homogénéité), tu devrais n'utiliser qu'une seule des deux formes.
    A oui, c'est vrai que je n'ai pas besoin de faire les deux

    Citation Envoyé par Mose
    - Tu récupère un Array et tu fais du GetValue alors que plus simplement tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // on récupère un tableau de noms de fichier
    string[] droppefiles = (string[])e.Data.GetData(DataFormats.FileDrop);
    // on ne s'intéresse qu'au premier nom de fichier
    string firstfilename = droppefiles[0];
    Je trouve ça plus lisible, mais bon... c'est une question de point de vue
    Tout compte fait tu as raison, surtout que j'ai besoin de récupérer mon nom de fichier dans une chaîne...

    Maintenant je saurai faire des drag & drop de fichiers

    Merci Mose.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2010] Userform - glisser-déposer de fichier dans une listbox
    Par vlv35 dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 28/10/2014, 09h51
  2. Permettre le glisser-déposer de fichier dans un site internet
    Par Invité dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 19/01/2011, 23h57
  3. [Batch] Modification d'un fichier txt par glisser/déposer
    Par L.rod dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 18/09/2009, 13h41
  4. Réponses: 0
    Dernier message: 03/11/2008, 12h44
  5. Glisser/déposer un fichier sur une appli VB
    Par kafifi dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/11/2006, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo