0

这是我关于堆栈溢出的第一篇文章,所以如果我错过了一些发布协议,请原谅。几天来,我一直在拼命寻找解决方案,但没有运气。我可能在这里遗漏了一些非常基本的东西,但我不确定。

我正在尝试使用 VB.net 创建一个 VSTO 插件。我正在使用 Visual Studio 2019。插件需要为最终用户创建或打开的每个 excel 文件实例加载(也就是创建新文件并打开现有文件)。当打开单个 Excel 实例时,我的插件可以正常工作。但是,当打开多个 excel 文件时,我的插件似乎表现得很奇怪。

简而言之,我将有 2 个功能区按钮。第一个按钮是显示/隐藏任务窗格,第二个按钮是对放置在该任务窗格实例中的控件执行一些操作。例如,我可能在自定义任务窗格中有一个文本框,其中显示了其加载的工作簿的一些属性。经过大量研究后,我发现管理多个工作簿的任务窗格实例的最佳方法是创建一个字典来维护多个任务窗格(每个用于 excel 实例)。因此,我有以下代码来检查任务窗格是否存在,如果不存在则为已加载的工作簿创建一个。

Imports Microsoft.Office.Core
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Tools

Public Class ThisAddIn
    Public taskPane As Microsoft.Office.Tools.CustomTaskPane
    Public WbCtp As New Dictionary(Of String, Microsoft.Office.Tools.CustomTaskPane)()

Private Sub Application_WorkbookActivate(Wb As Workbook) Handles Application.WorkbookActivate
    Dim ctp
    ctp = WbCtp.Where(Function(x) x.Key = Wb.FullName).FirstOrDefault().Value
    If ctp Is Nothing Then
        Globals.Ribbons.Ribbon1.ToggleButton1.Checked = False
        'taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(New UserControl1(), Format(Now, "hh:mm:ss"))
        taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(New UserControl1(), Format(Now, "hh:mm:ss"))

        WbCtp.Add(Wb.FullName, taskPane)
    Else
        taskPane = ctp
    End If
End Sub
End Class

我的功能区代码如下:

Imports Microsoft.Office.Tools.Ribbon

Public Class Ribbon1
    Private Sub ToggleButton1_Click(sender As Object, e As RibbonControlEventArgs) Handles ToggleButton1.Click
        Dim taskPane = Globals.ThisAddIn.taskPane
        If taskPane IsNot Nothing Then
            taskPane.Width = 500
            taskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
            'taskPane.Title = Format(Now, "hh:mm:ss")
            If taskPane.Visible = True Then
                taskPane.Visible = False
            Else
                taskPane.Visible = True
            End If
        End If
    End Sub
Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click

    '**HERE I WANT THIS BUTTON TO CHANGE A VALUE OF THE TEXTBOX ON THE USERCONTROL**

End Sub
End Class

我试过这样的事情:

    Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click
    'HERE I WANT THIS BUTTON TO CHANGE A VALUE OF THE TEXTBOX ON THE USERCONTROL
    UserControl1.tb.Text = Format(Now, "hh:mm:ss")

End Sub

这里的问题是,当我在加载任务窗格的情况下打开 2 或 3 个 excel 实例时,功能区上的 button1 单击不会更新文本框的正确实例。相反,它会更新另一个工作簿的文本框值。

如何获得我放入用户控件(加载在任务窗格中)中的所有控件的正确实例,以便我可以更改它们的属性,或调用它们的方法并将它们应用于所需的适当工作簿(在此案例工作簿,我正在努力)。

感谢您花时间阅读,我真诚地感谢您在这方面的任何帮助或指导。

4

0 回答 0