问题描述
我遇到一个问题:动态创建复选框,每个复选框都订阅一个事件。选中复选框后,它会选择梁的支撑。如果未选中,则取消选择不支持的元素。问题是collection属性为我提供了一个修改后的collection异常。...
List<ElementId> elementIds = new List<ElementId>();
public List<ElementId> ElementIds { get; set; }
private void CheckBox_CheckedChanged(object sender,EventArgs e)
{
UIDocument uidoc = new UIDocument(document);
CheckBox checkBox = (CheckBox)sender;
if (checkBox.Checked)
{
Element element = supportelements.FirstOrDefault(q => q.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Asstring() == GetMark(checkBox));
if (elementIds.Any(q => q.Equals(element.Id)))
return;
else
{
elementIds.Add(element.Id);
ICollection<ElementId> Ids = new List<ElementId>() { element.Id };
uidoc.Selection.SetElementIds(Ids);
uidoc.RefreshActiveView();
}
ElementIds = elementIds;
}
else if (!checkBox.Checked)
{
ElementId invalid = ElementId.InvalidElementId;
List<ElementId> invalidList = new List<ElementId>
{
invalid
};
uidoc.Selection.SetElementIds(invalidList);
uidoc.RefreshActiveView();
if (ElementIds != null)
{
ElementId elementId = supportelements.FirstOrDefault(q => q.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Asstring() == GetMark(checkBox)).Id;
elementIds.Remove(elementId);
}
}
}
解决方法
您的上述声明之一是呼叫map()
。
考虑这意味着什么。
例如,您告诉Revit,“嘿,看,这是一个无效的元素。请为我选择并突出显示在屏幕上。'
如果我是Revit,我会拒绝。
如何简单地提供一个空的元素ID列表,然后说:“这里是零个元素。请选择并突出显示这些内容。'
我可以想象这可能会更好。