如何遍历嵌套单元子元素


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