FileDialog .SelectedItems(1) outlook VSTO 加载项未返回文件路径

FileDialog .SelectedItems(1) outlook VSTO add-in is not returning file path

我正在尝试在 Visual Studio 2017 年使用 Visual Basic 创建一个 Outlook VSTO 加载项,出于某种原因,我需要使用 Excel 从功能区单击一个按钮来获取文件位置FileDialog 通过导入 Microsoft.Office.Interop.Excel。我在此处添加了代码,VBA 宏的相同代码模式在 outlook 的内置 VBA window 中运行良好,但是当我执行此代码时(针对 VSTO 添加进行了修改-In) 在 Visual Studio 调试模式下它会打开 FileDialog 弹出窗口,我可以 select 单个文件但是 .SelectedItems(1) 不是 returning [=] 中的任何路径63=] 输出。非常感谢您的帮助。谢谢。

#

VBA 代码(在 Outlook VBA Window 中工作)

Sub SelectFile()
  Const msoFileDialogFilePicker As Long = 3

  Dim xlObj As Excel.Application
  Dim objDialog As Office.FileDialog
  Dim pstPath As String

  Set xlObj = Excel.Application
  Set objDialog = xlObj.FileDialog(msoFileDialogFilePicker)

  With objDialog
    .AllowMultiSelect = False
    .Title = "Select your PST File"
    .ButtonName = "Ok"
    .Show

    If .SelectedItems.Count = 0 Then
        MsgBox ("No file selected.")
    Else            
        pstPath = .SelectedItems(1)
        MsgBox ("You have selected: " & pstPath)
    End If

  End With
  xlObj.Quit()
  Set objDialog = Nothing
End Sub

VBA_Code

还有... VBA_Output
..

#

VSTO 代码:输出中没有文件路径(使用 Visual Studio 2017)

Public Sub SelectFile()

    Const msoFileDialogFilePicker As Long = 3
    Dim xlObj As Excel.Application
    Dim objDialog As Office.FileDialog
    Dim pstPath As String

    xlObj = New Excel.Application
    objDialog = xlObj.FileDialog(msoFileDialogFilePicker)

    With objDialog
        .AllowMultiSelect = False
        .Title = "Select your PST File"
        .ButtonName = "Ok"
        .Show()

        If .SelectedItems.Count = 0 Then
            MsgBox("No file selected.")
        Else                
            pstPath = .SelectedItems(1)
            MsgBox("You have selected: " & .SelectedItems(1))
        End If

    End With
    xlObj.Quit()
    objDialog = Nothing
End Sub

VSTO_Code_VisualStudio17

还有……VSTO_Output

注意:方法 1 不适用于 Outlook。如果有人在这里寻找其他 VSTO 应用程序中的解决方案,只需将其包括在内即可。

方法 1(Excel,仅限 Word、PowerPoint)

这是由于 .NET 中基于零的索引。尽管许多 VSTO 集合使用基于 1 的索引,但 SelectedItems 不是其中之一。另请注意,永远不要(永远)在 VSTO 加载项中使用 new Application()。所有 VSTO 加载项默认获取 Globals.ThisAddin.Application(或 this.Application,如果你已经在 ThisAddin class),你可以使用它来访问当前应用程序实例。

所以你的原始代码应该是这样的:

Public Sub SelectFile()
  Dim objDialog = Me.Application.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFilePicker)

  With objDialog
    .AllowMultiSelect = False
    .Title = "Select your PST File"
    .ButtonName = "OK"
    If .Show() = -1 Then
      MsgBox("You have selected: " & .SelectedItems(0))
    Else
      MsgBox("No file selected.")
    End If
  End With
End Sub

方法 2(所有 VSTO 和其他 WinForms/WPF 应用程序)

由于 FileDialog 在 Outlook 中不可用,另一种方法是使用 Microsoft.Win32 对话框来达到相同的目的。这是我过去项目的一些代码:

Public Sub SelectFile()
  Dim openDialog As new Microsoft.Win32.OpenFileDialog()
openDialog.Filter = "Audio files (*.wav, *.mp3, *.m4a)|*.wav;*.mp3;*.m4a"
  If openDialog.ShowDialog().GetValueOrDefault() Then
   Dim NewAudioFilePath = openDialog.FileName
  End If
End Sub

您必须添加对 PresentationFramework 库的引用才能正常工作。