我在从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();
}
你有什么想法吗?
答案 0 :(得分: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中创建空名称(“Action”)的步骤,但您可以通过API完成此操作。
答案 1 :(得分:0)
我认为问题在于Update()
来电。
EA.Collection.DeleteAt()
将立即从数据库中删除该元素(但不会从内存中的集合中删除)。但是,如果你在刚刚创建的对象上调用Update()
,我认为它会重新创建它,可能还有一个新的序列号;这解释了为什么删除的步骤现在被移动"到最后。
尝试删除Update()
电话,看看是否有帮助。