写这篇文章的初衷来自于优先社区这个帖子:[MSCE C#]您好老师我想请问下,我修改了cell中的子元素然后replaceinmodel文件中的cell元素就出错请问是什么原因呢?有没有案例代码可供参考呢?,发帖者在使用“ChildEditElemIter“迭代单元子元素时,想修改子元素的某些属性,在对单元的第一层子元素操作时是没有问题的。但是当第一层子元素中有单元,对嵌套单元的子元素做属性修改时,却始终修改不成功。如下是测试代码(在用户代码基础上做了修改):
bool ChangeCellSubElementsColor() { ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (selectset.GetCount() < 1) { return false; } EditElementHandle& eehCell = selectset[0]; ElementPropertiesSetterPtr elePropSet = ElementPropertiesSetter::Create(); elePropSet->SetColor(4); for (ChildEditElemIter child(eehCell); child.IsValid(); child = child.ToNext()) { if (child.GetElementType() == MSElementTypes::CELL_HEADER_ELM) { for (ChildEditElemIter child2(child); child2.IsValid(); child2 = child2.ToNext()) { elePropSet->Apply(child2); } } } if (eehCell.ReplaceInModel(eehCell.GetElementRef()) != SUCCESS) { return false; } return true; }
经过调试发现在内层for循环中,对嵌套单元的子元素进行迭代时,并没有迭代到这些子元素,迭代到的还是最外层单元的子元素。查阅了Mstn源代码后才得知,其实“ChildEditElemIter child2(child)”这里拿到的“child2”实际上仅仅是对“child”做了一个拷贝,相当于“child2=child”。所以这里内层for循环是沿着外层for循环继续去迭代第一层子元素了,如果想迭代下一层的子元素的话,需要调用ChildEditElemIter的另外一个构造函数,如下所示:
修改完善后的代码如下所示:
bool ChangeCellSubElementsColor() { ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (selectset.GetCount() < 1) { Return false; } EditElementHandle& eehCell = selectset[0]; ElementPropertiesSetterPtr elePropSet = ElementPropertiesSetter::Create(); elePropSet->SetColor(4); for (ChildEditElemIter child(eehCell); child.IsValid(); child = child.ToNext()) { if (child.GetElementType() == MSElementTypes::CELL_HEADER_ELM) { EditElementHandleR eehChild = child; for (ChildEditElemIter child2(eehChild); child2.IsValid(); child2 = child2.ToNext()) { elePropSet->Apply(child2); } } } if (eehCell.ReplaceInModel(eehCell.GetElementRef()) != SUCCESS) { return false; } return true; }
主要变化是我们在进入内层for循环之前定义了一个“EditElementHandleR”类型的变量,然后在循环中用这个变量去初始化迭代器,这样就可以在内层for循环中迭代到第二层子元素了。