Вообщем решил пойти по другому пути.
Получать даные не из спецификации, а напрямую из объектов.
Получил, выбранные, пользователем колонки:
IList<SchedulableField> schedulableFields = selectedSchedule.Definition.GetSchedulableFields();
foreach (SchedulableField sf in schedulableFields) {
if (sf.ParameterId.IntegerValue < 0) {
IList<ScheduleFieldId> ids = selectedSchedule.Definition.GetFieldOrder();
foreach (ScheduleFieldId id in ids) {
ScheduleField field = selectedSchedule.Definition.GetField(id);
try {
if (field.GetSchedulableField() == sf) {
c_lbScheduleHeaders.Items.Add(field.GetName() + "[" + field.ColumnHeading + "]");
break;
}
}
catch { }
}
}
}
А далее просто перебрал объекты, которые находятся в спецификации и получил активные свойства:
DataTable dt = new DataTable();
foreach (string col in listItems)
dt.Columns.Add(col, typeof(string));
FilteredElementCollector ids = new FilteredElementCollector(selectedSchedule.Document, selectedSchedule.Id);
var elementIds = ids.WhereElementIsNotElementType().ToElementIds();
List<string> data = new List<string>();
foreach (ElementId elementId in elementIds) {
Element element = doc.GetElement(elementId);
foreach (string stringParameter in parameters) {
Parameter parameter = element.LookupParameter(stringParameter);
if (null != parameter)
data.Add(element.LookupParameter(stringParameter).AsValueString());
}
dt.Rows.Add(data.ToArray());
data.Clear();
}
Некрасиво, но работает намного быстрее, нежели через GetSchedulableFields()