Benutzer mit den meisten Antworten
Outlook Emails oder Anhänge per Drag and Drop in die eigene Applikation ziehen.

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
- Bearbeitet Siegfried Reichmann Samstag, 22. Juli 2017 09:26
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
- Bearbeitet Siegfried Reichmann Dienstag, 8. August 2017 17:33
- Als Antwort vorgeschlagen Florian Haupt Mittwoch, 9. August 2017 07:01
- Als Antwort markiert Siegfried Reichmann Freitag, 11. August 2017 05:40
Alle Antworten
-
Diese Frage wurde hier bereits beantwortet:
https://social.msdn.microsoft.com/Forums/vstudio/de-DE/87423136-2fd5-4715-b514-64738414990d/drag-and-drop-von-outlook-to-c-applikation?forum=visualcsharpde
- Gruß Florian
- Bearbeitet Florian Haupt Montag, 24. Juli 2017 07:37
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Montag, 31. Juli 2017 05:26
- Nicht als Antwort vorgeschlagen Siegfried Reichmann Mittwoch, 2. August 2017 23:57
-
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
-
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
-
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
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 8. August 2017 06:52
-
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
- Bearbeitet Siegfried Reichmann Dienstag, 8. August 2017 17:33
- Als Antwort vorgeschlagen Florian Haupt Mittwoch, 9. August 2017 07:01
- Als Antwort markiert Siegfried Reichmann Freitag, 11. August 2017 05:40