Автоматическое изменение размера объекта списка .NET - Excel в привязке данных
-
09-06-2019 - |
Вопрос
Я разрабатываю надстройку Excel 2007 с использованием Visual Studio Tools для Office (2008).У меня есть один лист с несколькими ListObjects на нем, которые привязываются к таблицам данных при запуске.Когда они привязаны, они автоматически изменяют свой размер правильно.
Проблема возникает, когда они повторно привязываются.У меня есть пользовательская кнопка на панели ленты, которая возвращается в базу данных и извлекает различную информацию на основе некоторых критериев, которые вводит пользователь.Эти новые данные возвращаются и повторно привязываются к ListObjects - однако на этот раз их размер не изменяется, и я получаю исключение:
ListObject не может быть привязан, поскольку его нельзя изменить в соответствии с данными.Объекту ListObject не удалось добавить новые строки.Это может быть вызвано тем, что невозможно переместить объекты ниже объекта списка .
Внутреннее исключение:"Ошибка вставки метода класса Range"
Причина:Майкрософт.Офис.Инструменты.Excel.Причина сбоя.Не удалось преобразовать список объектов
Мне не удалось найти ничего особо значимого по поводу этой ошибки в Google или MSDN.Я пытался разобраться в этом некоторое время, но безрезультатно.
Базовая структура кода:
//at startup
DataTable tbl = //get from database
listObj1.SetDataBinding(tbl);
DataTable tbl2 = //get from database
listObj2.SetDataBinding(tbl2);
//in buttonClick event handler
DataTable tbl = //get different info from database
//have tried with and without unbinding old source
listObj1.SetDataBinding(tbl); <-- exception here
DataTable tbl2 = //get different info from database
listObj2.SetDataBinding(tbl2);
Обратите внимание, что это исключение возникает даже тогда, когда ListObject сжимается, а не только когда он растет.
Решение
Если у кого-то еще возникла эта проблема, я нашел причину этого исключения.ListObjects автоматически изменит размер при привязке, если они не влияют на какие-либо другие объекты на листе.Имейте в виду, что ListObjects могут влиять только на диапазоны, которые они охватывают.
В моем случае объект list, который находился над другим, имел меньше столбцов, чем тот, что был под ним.Допустим, верхний ListObject имеет 2 столбца, а нижний ListObject имеет 3 столбца.Когда верхний ListObject изменил количество строк, у него не было возможности вносить какие-либо изменения в третий столбец, поскольку он не входил в его базовый диапазон.Это означает, что не удалось сдвинуть ни одной ячейки в третьем столбце, и поэтому второй ListObject не удалось переместить должным образом, что привело к моему исключению выше.
Изменение положения ListObjects для размещения более широкого над меньшим работает нормально.Следуя приведенной выше логике, теперь это означает, что более широкий ListObject может сдвигать все столбцы второго ListObject, и поскольку ниже меньшего ничего нет, он также может сдвигать любые необходимые ячейки.Причина, по которой у меня не возникло никаких проблем с начальной привязкой, заключается в том, что оба объекта ListObject были одной ячейкой.
Поскольку в моем случае это не оптимально, я, вероятно, буду использовать пустые столбцы или попытаюсь поиграть с невидимыми столбцами, если это возможно, но, по крайней мере, причина теперь ясна.
Другие советы
У меня аналогичная проблема с обновлением нескольких listobjects.Мы устанавливаем для каждого ListObject.DataSource = null, затем повторяем привязку, начиная с нижнего listobject и продвигаясь вверх, а не сверху вниз.
Просто идея чего-то, что можно попробовать, чтобы посмотреть, даст ли это вам больше информации:Попробуйте изменить размер объекта списка перед строкой исключения и посмотрите, не вызывает ли это также исключение.Если нет, попробуйте изменить размер объекта range до нового размера DataTable.
Вы говорите, что это происходит, когда ListObject сжимается и растет.Происходит ли это также, если ListObject остается того же размера?