如何将字符串转为DevExpress BarSubItem?权限控制遇类型转换错误
解决方案:字符串匹配DevExpress BarSubItem并设置权限
你遇到的错误核心是字符串类型与BarSubItem类型完全不兼容,TryCast仅支持继承/实现关系的类型转换,直接将字符串转为BarSubItem是无效的。正确的做法是通过字符串名称查找对应的BarSubItem实例,再设置权限。
方法1:通过BarManager查找(推荐)
DevExpress的Bar组件通常由BarManager统一管理,直接从其Items集合按名称匹配:
Dim BarParmTxt As String = "BarFile" ' 替换为你的BarManager实例名,比如barManager1 Dim targetItem = barManager1.Items.Cast(Of BarItem)().FirstOrDefault(Function(item) item.Name = BarParmTxt) If TypeOf targetItem Is BarSubItem Then ' 根据权限设置:有权限设为True,无权限设为False DirectCast(targetItem, BarSubItem).Enabled = False End If
方法2:遍历目标Bar的Items
如果BarSubItem属于特定Bar(如窗体上的barMain),直接遍历该Bar的Items集合:
Dim BarParmTxt As String = "BarFile" ' 替换为你的Bar实例名,比如barMain Dim targetItem = barMain.Items.Cast(Of BarItem)().FirstOrDefault(Function(item) item.Name = BarParmTxt) If targetItem IsNot Nothing AndAlso TypeOf targetItem Is BarSubItem Then DirectCast(targetItem, BarSubItem).Enabled = False End If
方法3:反射获取窗体成员(适合BarSubItem为窗体字段的场景)
若BarSubItem是窗体的私有/公共成员变量,可通过反射直接获取:
Dim BarParmTxt As String = "BarFile" Dim fieldInfo = Me.GetType().GetField(BarParmTxt, Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic) If fieldInfo IsNot Nothing Then Dim subMenu = DirectCast(fieldInfo.GetValue(Me), BarSubItem) If subMenu IsNot Nothing Then subMenu.Enabled = False End If End If
注意事项
- 确保数据库存储的名称与BarSubItem的
Name属性完全一致(区分大小写) - 必须处理
targetItem为空的情况,避免空引用异常 - 根据权限逻辑调整
Enabled值:有权限时设为True,无权限设为False
内容的提问来源于stack exchange,提问作者Ahmed Rashed
相关产品推荐
相关产品推荐

