C# EA插件如何拦截已审批元素修改并获取修改前状态
EA插件阻止已批准元素修改的解决方案
针对你需要拦截状态为"Approved"的元素修改,同时获取修改前后状态的需求,有两种可行的实现方式:
方法一:利用EA_OnPreCommit预提交事件
这个事件会在所有修改提交到数据库前触发,能直接获取到每个字段的新旧值,是最可靠的拦截方式。
public virtual void EA_OnPreCommit(Repository repository, ref bool IsCanceled) { // 获取所有待提交的变更记录 var pendingChanges = repository.GetProjectInterface().GetPendingChanges(); foreach (var change in pendingChanges) { // 只处理元素的状态字段变更 if (change.Type.Equals("Element", StringComparison.OrdinalIgnoreCase) && change.Field.Equals("Status", StringComparison.OrdinalIgnoreCase)) { // 获取修改前后的状态值 string oldStatus = change.OldValue; string newStatus = change.NewValue; // 规则1:原状态为Approved时,禁止任何修改 if (oldStatus == "Approved") { IsCanceled = true; repository.ShowMessage("无法修改状态为「Approved」的元素,请先变更状态再操作。"); break; } // 规则2:仅允许从Implemented状态切换到Approved(可根据需求调整) if (newStatus == "Approved" && oldStatus != "Implemented") { IsCanceled = true; repository.ShowMessage("仅状态为「Implemented」的元素可设置为「Approved」。"); break; } } } }
方法二:缓存元素原始状态
通过EA_OnContextItemChanged记录当前选中元素的状态,在EA_OnContextItemModified触发时对比新旧状态,适合单元素修改的场景。
// 全局变量缓存当前选中元素的原始状态 private string _currentElementStatus; public virtual void EA_OnContextItemChanged(Repository repository, string guid, ObjectType ot) { if (ot == ObjectType.otElement && repository != null) { var element = repository.GetElementByGuid(guid); _currentElementStatus = element.Status; } } public virtual void EA_OnContextItemModified(Repository repository, string guid, ObjectType ot) { if (ot == ObjectType.otElement && repository != null) { var element = repository.GetElementByGuid(guid); string newStatus = element.Status; // 原状态为Approved时禁止修改 if (_currentElementStatus == "Approved") { throw new Exception("无法修改状态为「Approved」的元素,请先变更状态再操作。"); } // 仅允许从Implemented切换到Approved if (newStatus == "Approved" && _currentElementStatus != "Implemented") { throw new Exception("仅状态为「Implemented」的元素可设置为「Approved」。"); } // 更新缓存为最新状态 _currentElementStatus = newStatus; } }
两种方法对比
EA_OnPreCommit:覆盖所有提交场景(包括批量修改、脚本修改),拦截更全面,但需要遍历所有变更记录。- 缓存状态:仅针对当前选中的元素,逻辑更简单,但无法拦截批量修改或非UI触发的修改。
内容的提问来源于stack exchange,提问作者Ice
相关产品推荐
相关产品推荐

