2016-08-12 1 views
0

Ich habe folgendes Problem. Ich habe ein Fenster, das sich öffnet und mir erlaubt, einige Dateien auszuwählen. Dann kann ich mit der rechten Maustaste auf das Fenster klicken und Pfade ausgewählter Dateien an einen neuen Mail-Dialog anhängen.Outlook VSTO - Hinzufügen von Dateipfad/Hyperlink zu MailItem WordEditor aus Outlook VSTO

Der Arbeitsablauf ist wie folgt:

  1. Ich öffne mein Fenster und wählen paar Dateien

  2. der rechten Maustaste, wählen Sie ausgewählte Dateien Pfade hinzufügen

  3. Logic MailItem wird Überprüfen Sie, ob es eine ActiveInspector

    3.1. Wenn es einen gibt, bekomme ich seine CurrentItem as MailItem (so, neue Mail-Dialog existiert und muss nicht erstellt werden)

    3.2. Wenn es keine gibt, nenne ich CreateItem(Microsoft.Office.Interop.OLItemType.olMailItem) neuen E-Mail-Dialog zu schaffen und dann rufe ich MailItem.Display(false) die Postsendung anzuzeigen Dialog

  4. Next I Schleife durch die Liste der ausgewählten Dateien Pfade und fügen Sie sie in den neuen E-Mail-Dialog. Das funktioniert großartig.

PROBLEM Wenn ich mein Fenster zum 2. Mal öffnen, um mehrere Dateien auswählen und ihre Pfade zu demselben Mail-Dialog hinzufügen ich früher geöffnet, werden sie nicht hinzugefügt. Hier

ist der Code:

public void AddFilePaths(List<string> paths) 
{ 
    if (paths.Count > 0) 
    { 
     var inspector = MyAddIn.Application.ActiveInspector(); 
     MailItem mi = null; 
     bool newMailItem = false; 

     if (inspector != null) 
     { 
      // If new mail dialog is already open, just get it. 
      // This is called on my 2nd attempt to add paths to new mail. 
      // This MailItem is the same one created on 1st call in below 
      // else block. I confirmed that by adding some dummy email 
      // Body in below else block, then checking for it here on 
      // 2nd call. I think this proves that correct 
      // Inspector/MailItem is returned here. 
      mi = MyAddIn.Application.ActiveInspector().CurrentItem as MailItem; 
     } 
     else 
     { 
      // create new mail dialog and display it 
      // this is called on my 1st call to add paths to new mail 
      mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); 
      mi.Body = "Dummy email body"; 
      newMailItem = true; 
     } 

     if (newMailItem) 
     { 
      mi.Display(); 
      inspector = MyAddIn.Application.ActiveInspector(); 
     } 

     if (inspector != null) 
     { 
      foreach (var path in paths) 
      { 
       AddPathToActiveInspector(path); 
      } 
     } 
    } 
} 

Der obige Code ruft diese Methode hinzuzufügen Pfad zum aktuellen ActiveInspectorWordEditor:

public void AddPathToActiveInspector(string path) 
{ 
    var inspector = MyAddIn.Application.ActiveInspector(); 
    dynamic we = inspector.WordEditor; 
    dynamic word = we.Application; 
    const string nl = "\n"; 

    // I have noticed that if I am debugging, this line will throw error 
    // "COMException was unhandled by user code", "An exception of type 
    // System.Runtime.Interop.Services.COMException occurred in 
    // System.Dynamic.dll but was not handled by user code: 
    // Message: This command is not available 
    // InnerException: null 
    // I have also seen following error on 2nd attempt: "The TypeText  
    // method or property is not available because the document is 
    // locked for editing." 
    word.Selection.TypeText(nl); 

    string address = path; 
    string subAddress = ""; 
    string screenTip = ""; 
    string displayText = path; 
    word.ActiveDocument.Hyperlinks.Add(word.Selection.Range, ref address, ref subAddress, ref screenTip, ref displayText); 
    word.Selection.TypeText(" "); 
} 
+0

Was passiert also, wenn Sie Ihren Code durchgehen? Läuft es tatsächlich? Sind Sie sicher, dass es nur einen Inspektor gibt? Was machst du mit Inline-Antworten –

+0

Danke Dmitry, bitte sehen Sie meine aktualisierte Frage. Ich habe den Code ausfindig gemacht und erhalte den richtigen Inspector/MailItem, den ich durch Hinzufügen einer Dummy-MailItem.Body-Nachricht bestätigt habe, wenn MailItem erstellt wurde (beim ersten Aufruf), und dann Body auf diesen Text beim zweiten Aufruf überprüft. Ich habe das zu meinem obigen Code-Kommentar hinzugefügt. Ich habe auch festgestellt, dass eine COMException ausgelöst wird, aber nur während des Debuggens (???).Ich habe dazu auch einen Kommentar in meinen Code hinzugefügt. In meinem Abschnitt Antworten und Weiterleitungen (Inline-Antworten) wird nichts überprüft und ich füge den ursprünglichen Nachrichtentext ein (wenn Sie das mit Inline-Antworten meinten. Sehr geschätzt – pixel

Antwort

1

ich einfach neue E-Mail-Nachricht jedes Mal schaffen würden Sie hinzufügen Ihre Pfade, um die Möglichkeit zu vermeiden, Pfade zu falschen E-Mail-Nachrichten hinzuzufügen, was passieren könnte, wenn Sie mehrere E-Mails geöffnet haben.

  1. In Bezug auf Microsoft.Office.Interop.Word zu einem Projekt
  2. hinzufügen Microsoft.Office.Interop.Word auf Ihre Klassendatei mit

Hier ist der Code:

public void AddFilePaths(List<string> paths) 
{ 
    if (paths.Count > 0) 
    { 
     MailItem mi = ThisAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); 
     mi.Display(); 
     if (mi!= null) 
     { 
      foreach (var path in paths) 
      { 
       AddPathsToNewEmailMessage(path); 
      } 
     } 
    } 
} 

Der obige Code ruft diese Methode auf Pfad zur neuen E-Mail-Nachricht hinzufügen WordEditor:

public void AddPathsToNewEmailMessage(string path) 
{ 
    object link = url; 
    object result = "url"; 
    object missing = Type.Missing; 
    string nl = "\n"; 

    var inspector = ThisAddIn.Application.ActiveInspector(); 
    MailItem currMessage = inspector.CurrentItem; 
    Word.Document doc = currMessage.GetInspector.WordEditor; 
    Word.Selection sel = doc.Windows[1].Selection; 
    doc.Hyperlinks.Add(sel.Range, ref result, ref missing, ref missing, ref link, ref missing); 
    sel.EndKey(Word.WdUnits.wdLine); 
    sel.InsertAfter(nl); 
    sel.MoveDownWord.WdUnits.wdLine); 
} 
+0

Das funktioniert großartig, danke! – pixel

Verwandte Themen