VB开发Outlook自定义任务窗格如何将UserControl控件设为Shared不被重置
解决方案
你当前的报错本质是直接通过类名访问实例成员导致的,强行修改自动生成的设计器代码添加Shared关键字每次被覆盖是正常现象,因为Visual Studio设计器每次调整控件布局/属性时都会重写.designer.vb文件的对应内容。以下是两种不需要修改设计器代码的可行方案:
方案1(推荐):全局持有UserControl实例
WinForm控件本身是实例级别的,每个UserControl实例对应独立的控件对象,强行设置Shared反而会引发多实例冲突、事件异常等问题,推荐通过全局变量存储当前使用的TaskManagerCtrl实例访问控件:
- 在
TaskManagement.vb模块中添加全局变量存储实例:
' 添加在模块的声明区域 Public CurrentTaskManager As TaskManagerCtrl
- 在你初始化Outlook任务窗格的代码中,将创建的TaskManagerCtrl实例赋值给该变量:
' 示例:你原本添加任务窗格的代码 Dim taskPane As Microsoft.Office.Tools.CustomTaskPane taskPane = Me.CustomTaskPanes.Add(New TaskManagerCtrl(), "任务管理面板") ' 新增赋值逻辑 CurrentTaskManager = CType(taskPane.Control, TaskManagerCtrl)
- 调整
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属性关联实例控件,设计器修改不会覆盖这部分代码:
- 打开
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
- 调整模块中的方法直接访问该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
相关产品推荐
相关产品推荐

