写这篇文章的初衷来自于优先社区这个帖子:[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循环中迭代到第二层子元素了。