You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB开发Outlook自定义任务窗格如何将UserControl控件设为Shared不被重置

解决方案

你当前的报错本质是直接通过类名访问实例成员导致的,强行修改自动生成的设计器代码添加Shared关键字每次被覆盖是正常现象,因为Visual Studio设计器每次调整控件布局/属性时都会重写.designer.vb文件的对应内容。以下是两种不需要修改设计器代码的可行方案:

方案1(推荐):全局持有UserControl实例

WinForm控件本身是实例级别的,每个UserControl实例对应独立的控件对象,强行设置Shared反而会引发多实例冲突、事件异常等问题,推荐通过全局变量存储当前使用的TaskManagerCtrl实例访问控件:

  1. 在TaskManagement.vb模块中添加全局变量存储实例:
' 添加在模块的声明区域
Public CurrentTaskManager As TaskManagerCtrl
  1. 在你初始化Outlook任务窗格的代码中,将创建的TaskManagerCtrl实例赋值给该变量:
' 示例:你原本添加任务窗格的代码
Dim taskPane As Microsoft.Office.Tools.CustomTaskPane
taskPane = Me.CustomTaskPanes.Add(New TaskManagerCtrl(), "任务管理面板")
' 新增赋值逻辑
CurrentTaskManager = CType(taskPane.Control, TaskManagerCtrl)
  1. 调整PopulateMatterList方法访问实例控件即可,无需修改任何设计器代码:
Public Sub PopulateMatterList()
    With CurrentTaskManager.lbMatterList
        .ClearSelected()
        .Items.Add(MatterListPrimary(0, 1) & " - " & MatterListPrimary(0, 0))
    End With
End Sub

方案2:自定义Shared属性映射实例控件

如果你坚持要通过类名直接访问控件,可以在UserControl的非自动生成代码文件(即TaskManagerCtrl.vb,不是.designer.vb)中添加Shared属性关联实例控件,设计器修改不会覆盖这部分代码:

  1. 打开TaskManagerCtrl.vb,添加如下代码:
Partial Class TaskManagerCtrl
    ' 声明Shared属性映射实例的ListBox控件
    Public Shared Property LbMatterListShared As ListBox

    ' 在控件加载时将当前实例的ListBox赋值给Shared属性
    Private Sub TaskManagerCtrl_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LbMatterListShared = Me.lbMatterList
    End Sub
End Class
  1. 调整模块中的方法直接访问该Shared属性:
Public Sub PopulateMatterList()
    With TaskManagerCtrl.LbMatterListShared
        .ClearSelected()
        .Items.Add(MatterListPrimary(0, 1) & " - " & MatterListPrimary(0, 0))
    End With
End Sub

注意:该方案仅适合全局只会创建一个TaskManagerCtrl实例的场景,如果存在多实例会出现控件覆盖的问题,优先推荐方案1。

内容的提问来源于stack exchange,提问作者Rowan le Clercq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:00:00