0

我在从 Enterprise Architect 加载项的场景中删除步骤时遇到问题

我想从元素中删除场景的空步骤,但它不起作用,这个“删除”的步骤存在于这个场景中。我的代码哪里出错了?

short esCnt = element.Scenarios.Count;
                for (short esIdx = (short)(esCnt - 1); esIdx >= 0; --esIdx)
                {
                    EA.IDualScenario es = element.Scenarios.GetAt(esIdx);
                    short essCnt = es.Steps.Count;
                    for (short essIdx = (short)(essCnt - 1); essIdx >= 0; --essIdx)
                    {
                        EA.IDualScenarioStep ess = es.Steps.GetAt(essIdx);
                        if (ess.Name.Trim().Length == 0 &&
                            ess.Uses.Trim().Length == 0 &&
                            ess.Results.Trim().Length == 0)
                        {
                            //1. section 
                            es.Steps.Delete(essIdx);
                            ess.Update();
                        }
                    }
                    //2. section 
                    es.Update();
                }

你有什么想法?

4

2 回答 2

0

看起来像一个接一个。Collection索引是从零开始的,但 GUI 中的场景步骤编号(如 中所示ScenarioStep.Pos)从 1 开始。因此,您实际上可能删除了错误的步骤。

foreach为了安全起见,当您更改要循环的集合时,不应使用循环,而应使用反向for循环:

int nrScenarios = element.Scenarios.Count;
for (int scenIx = nrScenarios - 1; scenIx >= 0; --scenIx) {
    Scenario scenario = element.Scenarios.GetAt(scenIx);
    int nrSteps = scenario.Steps.Count;
    for (int stepIx = nrSteps - 1; stepIx >= 0; --stepIx) {

在这种情况下,在外部循环中不如在内部循环中重要,因为那是您正在操作的集合。

除此之外,您根本不需要调用es.Update()element.Scenarios.Refresh()应该在内循环之外调用。

最后,你确定那Step.Name实际上是空的吗?我无法在 GUI 中创建名称为空的步骤(“操作”),但您可能已经能够通过 API 来完成。

于 2014-05-30T14:00:11.457 回答
0

我认为问题在于Update()通话。

EA.Collection.DeleteAt()立即从数据库中删除元素(而不是从内存中的集合中)。但是,如果您调用Update()刚刚创建的对象,我认为它会重新创建它,可能会使用新的序列号;这解释了为什么删除的步骤现在“移动”到最后。

尝试删除Update()呼叫,看看是否有帮助。

于 2015-08-31T09:29:09.323 回答