none
Outlook Emails oder Anhänge per Drag and Drop in die eigene Applikation ziehen. RRS feed

  • Frage

  • Hallo Experten,

    bin sicher, dass das schon irgendwer gelöst hat. Ich habe eine Applikation wo ich auch Dokumente ablegen muss. Entweder in einer vordefinierte Filestruktur oder im SQL Server. Das funktioniert mit Dateien aus dem File Explorer auch wunderbar, ich möchte aber wahlweise ein ganzes Email aus Outlook oder einen Anhang aus Outlook per Drag and Drop in meine Applikation bringen.

            private void dtaDokument_DragEnter(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    e.Effect = DragDropEffects.Copy;
                }
                else
                {
                e.Effect = DragDropEffects.All;
                }
            }

    Wie müsste meine Methode Dokument_DragDrop(....) aussehen, damit ich an die gesamte Email bzw. an den Anhang herankomme, je nachdem was gezogen wurde.

    Ich teste momentan mit Outlook 2010.

    Vielen Dank im Voraus

    Siegfried


    Samstag, 22. Juli 2017 09:23

Antworten

  • Hallo Florian Haupt,

    so hatte ich es schon gelöst bevor ich diesen Post abgesetzt habe. Das Problem ist, dass diese Vorgangsweise nicht mit Outlook DragDrop funktioniert.

    Die obigen Beispiele funktionieren entweder nur für DragDrap aus dem Windows Explorer oder nur für DragDrop aus Outlook. Ausserdem hat bei mir das Outlook Beispiel von oben für einzelne Attachments nicht funktioniert.

    Ich musste eine Lösung finden und hoffte dass das schon jemand gelöst hat. Ich habe jetzt eine Lösung die funktioniert. Und zwar für jene Bereiche die ich benötige.

    DragDrop aus Windows Explorer

    DragDrop ganzer Emails aus Outlook

    DragDrop einzelner Anhänge aus Outlook.

    Ich merke mir dazu im DragEnter Event um welche Art von DragDrop es sich handelt. Abhängig davon habe ich dann in DragDrop 3 unterschiedliche Routinen die mir jeweils das ausgewählte Objekt liefern. Ich kann immer nur ein Objekt für DragDrop erlauben, weil dazu noch Information für die Speicherung erfasst werden müssen.

    Die Variable _dragdropEffect ist eine Variable des Parent Objekts (Windows Form).

            private void dtaDokument_DragEnter(object sender, DragEventArgs e)
            {
                _dragdropEffect = "";
    
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "FileDrop";
                }
                if (e.Data.GetDataPresent(DataFormats.OemText))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (e.Data.GetDataPresent(DataFormats.Text))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (e.Data.GetDataPresent(DataFormats.UnicodeText))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (_dragdropEffect == "")
                {
                    e.Effect = DragDropEffects.All;
                    _dragdropEffect = "All";
                }
            }
    
            private void dtaDokument_DragDrop(object sender, DragEventArgs e)
            {
    
                if (_dragdropEffect == "FileDrop")
                {
                    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
                    if (files.Count() > 1)
                    {
                        MessageBox.Show("Bitte ziehen Sie die Dateien einzeln auf das Fenster, da pro Datei Informationen hinzugefügt werden müssen.", "Dokumente hinzufügen");
                        return;
                    }
                    foreach (string file in files)
                    {
                        bindingNavigatorAddNewItem.PerformClick();
                        dokumentNameTextBox.Text = file;
                        MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
                    }
                }
    
                if (_dragdropEffect == "All")
                {
    
                    int attcnt = oApp.ActiveExplorer().AttachmentSelection.Count;
                    if (attcnt > 1)
                    {
                        MessageBox.Show("Bitte ziehen Sie die Dateien einzeln auf das Fenster, da pro Datei Informationen hinzugefügt werden müssen.", "Dokumente hinzufügen");
                        return;
                    }
                    if (attcnt > 0)
                    {
                        for (int i = 1; i <= oApp.ActiveExplorer().AttachmentSelection.Count; i++)
                        {
                            Outlook.Attachment att = oApp.ActiveExplorer().AttachmentSelection[i];
                            att.SaveAsFile(tempDirectory + att.FileName);
                            bindingNavigatorAddNewItem.PerformClick();
                            dokumentNameTextBox.Text = tempDirectory + att.FileName;
                            MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
                        }
    
                    }
                }
    
                if (_dragdropEffect == "Text")
                {
                    for (int i = 1; i <= oApp.ActiveExplorer().Selection.Count; i++)
                    {
                        Object temp = oApp.ActiveExplorer().Selection[i];
    
                        if (temp is Outlook.MailItem)
                        {
                            Outlook.MailItem mailItem = (temp as Outlook.MailItem);
                            string subject = mailItem.Subject.Replace(":", "");
                            var x1 = mailItem.TaskStartDate;
                            string entryid = mailItem.EntryID;
                            string file = tempDirectory + "\\" + entryid + ".msg";
                            //In MSG datei Speichern 
                            mailItem.SaveAs(file, Microsoft.Office.Interop.Outlook.OlSaveAsType.olMSG);
    
                            bindingNavigatorAddNewItem.PerformClick();
                            dokumentNameTextBox.Text = file;
                            MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
    
                        }
                    }
                }

    Gruß

    Siegfried


    Dienstag, 8. August 2017 17:32

Alle Antworten

  • Es muss eine Möglichkeit geben, weil ich kann sowohl das komplette Email als auch jeden Anhang in das Dateisystem (Explorer) ziehen.

    Sonntag, 23. Juli 2017 14:19
  • Montag, 24. Juli 2017 07:37
  • Vielen Dank für den Hinweis, habe im Forum direkt nicht gesucht nur mit Google. Werde es heute noch probieren.

    Gruß, Siegfried

    Montag, 24. Juli 2017 08:38
  • Hallo Florian,

    vielen Dank, das funktioniert grundsätzlich.

    Suche aber noch nach einer Möglichkeit nicht das ganze Email in meine Applikation zu ziehen, sondern nur einen Anhang.

    Die zweite Sache, wo ich noch auf der Suche bin, ist, dass auch über den Windows Explorer eine beliebige Datei per Drag/Drop abgelegt werden kann. Das hat schon funktioniert. Ich bin momenatan auf der Suche wie ich im DragDrop Event unterscheiden kann ob es von Outlook kommt oder vom Explorer.

    Gruß

    Siegfried

    Mittwoch, 26. Juli 2017 11:21
  • Hallo Ivan,

    Du hast diese Nachricht als Lösung vorgeschlagen. Sie funktioniert zwar für Drag/Drop von kompletten Emails, aber nicht, wenn man gleichzeitig die Funktion von Drag/Drop aus dem Windows Explorer benötigt. Ich möchte dem Kunden nicht zumuten, dass er für jede Art ein anders Control für den Drop verwenden muss. Es muß doch im DragDrop Event eine Unterscheidung geben.

    Grüße

    Siegfried

    Donnerstag, 3. August 2017 00:03
  • Hallo Siegfried Reichmann,

    der von mir verlinkte Beitrag beantwortet prinzipiell auch die Frage nach anderen Dateitypen, woher diese kommen ist für das Control völlig egal - es weiß davon auch gar nichts.

    Zur Erinnerung wie Drag'n'Drop klassisch aussieht:

    public partial class MeineForm : Form {
        public MeineForm() {
          InitializeComponent();
          this.AllowDrop = true;
          this.DragEnter += new DragEventHandler(Form_DragEnter);
          this.DragDrop += new DragEventHandler(Form_DragDrop);
        }
    
        void Form_DragEnter(object sender, DragEventArgs e) {
          if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
        }
    
        void Form_DragDrop(object sender, DragEventArgs e) {
          string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
          foreach (string file in files) 
    ...; // Mach was auch immer damit
        }
      }
    


    - Gruß Florian

    Donnerstag, 3. August 2017 07:08
  • Hallo Florian Haupt,

    so hatte ich es schon gelöst bevor ich diesen Post abgesetzt habe. Das Problem ist, dass diese Vorgangsweise nicht mit Outlook DragDrop funktioniert.

    Die obigen Beispiele funktionieren entweder nur für DragDrap aus dem Windows Explorer oder nur für DragDrop aus Outlook. Ausserdem hat bei mir das Outlook Beispiel von oben für einzelne Attachments nicht funktioniert.

    Ich musste eine Lösung finden und hoffte dass das schon jemand gelöst hat. Ich habe jetzt eine Lösung die funktioniert. Und zwar für jene Bereiche die ich benötige.

    DragDrop aus Windows Explorer

    DragDrop ganzer Emails aus Outlook

    DragDrop einzelner Anhänge aus Outlook.

    Ich merke mir dazu im DragEnter Event um welche Art von DragDrop es sich handelt. Abhängig davon habe ich dann in DragDrop 3 unterschiedliche Routinen die mir jeweils das ausgewählte Objekt liefern. Ich kann immer nur ein Objekt für DragDrop erlauben, weil dazu noch Information für die Speicherung erfasst werden müssen.

    Die Variable _dragdropEffect ist eine Variable des Parent Objekts (Windows Form).

            private void dtaDokument_DragEnter(object sender, DragEventArgs e)
            {
                _dragdropEffect = "";
    
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "FileDrop";
                }
                if (e.Data.GetDataPresent(DataFormats.OemText))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (e.Data.GetDataPresent(DataFormats.Text))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (e.Data.GetDataPresent(DataFormats.UnicodeText))
                {
                    e.Effect = DragDropEffects.Copy;
                    _dragdropEffect = "Text";
                }
                if (_dragdropEffect == "")
                {
                    e.Effect = DragDropEffects.All;
                    _dragdropEffect = "All";
                }
            }
    
            private void dtaDokument_DragDrop(object sender, DragEventArgs e)
            {
    
                if (_dragdropEffect == "FileDrop")
                {
                    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
                    if (files.Count() > 1)
                    {
                        MessageBox.Show("Bitte ziehen Sie die Dateien einzeln auf das Fenster, da pro Datei Informationen hinzugefügt werden müssen.", "Dokumente hinzufügen");
                        return;
                    }
                    foreach (string file in files)
                    {
                        bindingNavigatorAddNewItem.PerformClick();
                        dokumentNameTextBox.Text = file;
                        MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
                    }
                }
    
                if (_dragdropEffect == "All")
                {
    
                    int attcnt = oApp.ActiveExplorer().AttachmentSelection.Count;
                    if (attcnt > 1)
                    {
                        MessageBox.Show("Bitte ziehen Sie die Dateien einzeln auf das Fenster, da pro Datei Informationen hinzugefügt werden müssen.", "Dokumente hinzufügen");
                        return;
                    }
                    if (attcnt > 0)
                    {
                        for (int i = 1; i <= oApp.ActiveExplorer().AttachmentSelection.Count; i++)
                        {
                            Outlook.Attachment att = oApp.ActiveExplorer().AttachmentSelection[i];
                            att.SaveAsFile(tempDirectory + att.FileName);
                            bindingNavigatorAddNewItem.PerformClick();
                            dokumentNameTextBox.Text = tempDirectory + att.FileName;
                            MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
                        }
    
                    }
                }
    
                if (_dragdropEffect == "Text")
                {
                    for (int i = 1; i <= oApp.ActiveExplorer().Selection.Count; i++)
                    {
                        Object temp = oApp.ActiveExplorer().Selection[i];
    
                        if (temp is Outlook.MailItem)
                        {
                            Outlook.MailItem mailItem = (temp as Outlook.MailItem);
                            string subject = mailItem.Subject.Replace(":", "");
                            var x1 = mailItem.TaskStartDate;
                            string entryid = mailItem.EntryID;
                            string file = tempDirectory + "\\" + entryid + ".msg";
                            //In MSG datei Speichern 
                            mailItem.SaveAs(file, Microsoft.Office.Interop.Outlook.OlSaveAsType.olMSG);
    
                            bindingNavigatorAddNewItem.PerformClick();
                            dokumentNameTextBox.Text = file;
                            MessageBox.Show("Bitte wählen Sie die Dokumentart und ggf. den Lieferanten aus und tragen Sie die Besetellnummer und die Dokumentnummer ein.", "Hinzufügen neue Datei");
    
                        }
                    }
                }

    Gruß

    Siegfried


    Dienstag, 8. August 2017 17:32
  • Das ist genau das, was Du machen musst, die Inhalte unterscheiden und passend behandeln.

    - Gruß Florian

    Mittwoch, 9. August 2017 07:02