微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在自定义任务窗格上捕获控件实例

如何解决在自定义任务窗格上捕获控件实例

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

我正在尝试使用 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(),"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 不会更新文本框的正确实例。相反,它会更新另一个工作簿的文本框值。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。