2016-08-12 7 views
0

У меня возникла следующая проблема. У меня есть окно, которое открывается и позволяет мне выбирать некоторые файлы. Затем я могу щелкнуть правой кнопкой мыши по этому окну и выбрать подключение путей выбранных файлов к новому диалоговому окну.Outlook VSTO - Добавление пути к файлу/гиперссылки на MailItem WordEditor из Outlook VSTO

Рабочий процесс выглядит так:

  1. Я открываю окна и выберите несколько файлов

  2. правой кнопкой мыши, выберите команду, чтобы добавить выбранные файлы пути к MailItem

  3. логика проверьте, есть ли ActiveInspector

    3.1. Если он есть, я получаю его CurrentItem as MailItem (так что новый диалог почты существует и его не нужно создавать)

    3.2. Если его нет, я называю CreateItem(Microsoft.Office.Interop.OLItemType.olMailItem) создать новый диалог почты, а затем я называю MailItem.Display(false), чтобы отобразить пункт почтыдиалоговое

  4. Следующая I цикл по списку выбранных файлов дорожек и добавить их в новом окне почты. Это отлично работает.

ПРОБЛЕМА Если я открываю окно для 2-й раз, чтобы выбрать несколько файлов и добавить их пути к тому же диалоге почты я открыл ранее, они не добавляются.

Вот код:

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); 
      } 
     } 
    } 
} 

выше код вызывает этот метод, чтобы добавить путь к текущему 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

Итак, что произойдет, если вы пройдете через свой код? Это действительно работает? Вы уверены, что есть только один инспектор? Что вы делаете с inline-ответами –

+0

Спасибо, Дмитрий, см. Мой обновленный вопрос. Я проследил код, и я получил правильный инспектор/MailItem, который я подтвердил, добавив фиктивное сообщение MailItem.Body, когда MailItem создан (при первом вызове), а затем проверяя Body для этого текста во втором вызове. Я добавил это в мой комментарий к коду выше. Я также обнаружил, что вызывается COMException, но только при отладке (???).Я добавил комментарий в свой код для этого. В разделе «Ответы и переходы» (встроенные ответы) ничего не проверяется, и я включаю исходный текст сообщения (если это то, что вы имели в виду с встроенными ответами. Большое спасибо – pixel

ответ

1

Я бы просто создать новое сообщение электронной почты каждый раз, когда вы добавляете ваши пути, чтобы избежать возможности добавления путей к неправильному сообщению электронной почты, которое может произойти, если вы открыли несколько электронных писем.

  1. Добавить ссылку на Microsoft.Office.Interop.Word вашему проекту
  2. Добавить использованием Microsoft.Office.Interop.Word на верхней части вашего файла класса

Вот код:

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); 
      } 
     } 
    } 
} 

выше код вызывает этот метод добавить путь к новому сообщению электронной почты 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

Это отлично работает, спасибо! – pixel