基于Revit API的ObjectListView复选框列实现问题
问题核心原因排查
- 缺少Revit事务包裹:
BooleanCheckStatePutter中直接调用Parameter.Set()修改Revit文档属性,所有Revit文档修改操作必须在有效事务内执行,否则会抛出异常被ObjectListView内部捕获吞掉,表现为点击复选框无响应。 - 共享参数配置错误:需确认你创建的布尔型共享参数已正确绑定到「视图/图纸」类别,参数实例属性为「可编辑」,且当前项目内所有图纸实例都已加载该参数,
LookupParameter("checked")不会返回空值。 - 控件配置不全:ObjectListView需要全局开启
CheckBoxes = True,且对应列明确为CheckStateColumn类型,否则BooleanCheckStateGetter/Putter委托不会生效。
两种实现方案
方案1:修复共享参数绑定逻辑
如果需要将选中状态留存到Revit模型中,修正后的代码如下,核心增加事务包裹和空值判断:
' 先开启控件全局复选框支持 YourObjectListViewInstance.CheckBoxes = True With YourCheckBoxColumn .BooleanCheckStateGetter = Function(ByVal rowObject) Dim sheet As ViewSheet = CType(rowObject, ViewSheet) Dim checkParam = sheet.LookupParameter("checked") If checkParam Is Nothing Then Return False Return CType(checkParam.AsInteger(), Boolean) End Function .BooleanCheckStatePutter = Function(rowObject, newValue) Dim sheet As ViewSheet = CType(rowObject, ViewSheet) Dim checkParam = sheet.LookupParameter("checked") If checkParam Is Nothing Then Return False ' Revit修改操作必须包裹在事务内 Using trans As New Transaction(sheet.Document, "更新图纸选中状态") trans.Start() checkParam.Set(If(newValue = True, 1, 0)) trans.Commit() End Using Return newValue End Function End With
方案2:本地存储选中状态(更推荐)
无需修改Revit模型参数,仅在插件内存中记录选中状态,适合临时选图的场景,不会污染项目文件:
- 全局定义选中项存储集合
' 定义在窗体类全局位置,存储选中的图纸ID Private SelectedSheetIds As New HashSet(Of ElementId)
- 配置复选框列委托
YourObjectListViewInstance.CheckBoxes = True With YourCheckBoxColumn .BooleanCheckStateGetter = Function(ByVal rowObject) Dim sheet As ViewSheet = CType(rowObject, ViewSheet) Return SelectedSheetIds.Contains(sheet.Id) End Function .BooleanCheckStatePutter = Function(rowObject, newValue) Dim sheet As ViewSheet = CType(rowObject, ViewSheet) If newValue Then SelectedSheetIds.Add(sheet.Id) Else SelectedSheetIds.Remove(sheet.Id) End If ' 刷新当前行显示状态 YourObjectListViewInstance.RefreshObject(rowObject) Return newValue End Function End With
内容的提问来源于stack exchange,提问作者user3401514
相关产品推荐
相关产品推荐

