为复选框更改事件更正修改的集合异常

问题描述

我遇到一个问题:动态创建复选框,每个复选框都订阅一个事件。选中复选框后,它会选择梁的支撑。如果未选中,则取消选择不支持的元素。问题是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列表,然后说:“这里是零个元素。请选择并突出显示这些内容。'

我可以想象这可能会更好。