.NET - Excel ListObject автоматическое изменение размера при привязке данных - PullRequest
7 голосов
/ 21 августа 2008

Я разрабатываю надстройку для Excel 2007 с использованием Visual Studio Tools for Office (2008). У меня есть один лист с несколькими объектами ListObjects, которые при запуске связываются с таблицами данных. Когда они связаны, они автоматически изменяют размер.

Проблема возникает, когда они снова связаны. У меня есть пользовательская кнопка на ленточной панели, которая возвращается в базу данных и получает различную информацию на основе некоторых критериев, которые вводит пользователь. Эти новые данные возвращаются и связываются с объектами ListObjects - однако на этот раз они не изменяются, и я получаю исключение:

ListObject не может быть связан, потому что он не может быть изменен в соответствии с данными. ListObject не смог добавить новые строки. Это может быть вызвано из-за неспособность перемещать объекты ниже список объектов.

Внутреннее исключение: «Не удалось вставить метод класса Range»
Причина: Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

Мне не удалось найти ничего очень значимого в этой ошибке в 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, а не только при его увеличении.

Ответы [ 3 ]

4 голосов
/ 25 августа 2008

Если у кого-то еще возникла эта проблема, я нашел причину этого исключения. Объекты ListObject автоматически изменят размер при связывании, если они не влияют на другие объекты на листе. Имейте в виду, что объекты ListObject могут влиять только на диапазоны, которые они окружают.

В моем случае, у объекта списка, который был выше другого, было меньше столбцов, чем у объекта под ним. Допустим, верхний ListObject имел 2 столбца, а нижний ListObject имел 3 столбца. Когда верхний объект ListObject изменил количество строк, у него не было возможности вносить какие-либо изменения в третий столбец, поскольку он не входил в его базовый диапазон. Это означает, что он не может сместить ячейки в третьем столбце, и поэтому второй объект ListObject не может быть перемещен должным образом, что привело к моему исключению выше.

Изменение положения объектов ListObject для размещения более широкого над меньшим работает нормально. Следуя приведенной выше логике, теперь это означает, что более широкий объект ListObject может смещать все столбцы второго объекта ListObject, а поскольку ниже меньшего нет ничего, он также может смещать любые необходимые ячейки. Причина, по которой у меня не возникло проблем с начальным связыванием, заключается в том, что оба объекта ListObject были одной ячейкой.

Поскольку в моем случае это не оптимально, я, вероятно, буду использовать пустые столбцы или попытаюсь поиграть с невидимыми столбцами, если это возможно, но, по крайней мере, причина теперь ясна.

1 голос
/ 18 марта 2009

У меня похожая проблема с обновленными множественными объектами. Мы устанавливаем каждый listObject.DataSource = null, затем перепривязываем, начиная с нижнего объекта listobject и продвигаясь вверх, а не сверху вниз.

0 голосов
/ 23 августа 2008

Просто идея чего-то, чтобы попытаться выяснить, дает ли это вам больше информации: Попробуйте изменить размер объекта списка перед строкой исключения и посмотреть, если это также вызывает исключение. Если нет, попробуйте изменить размер объекта диапазона до нового размера DataTable.

Вы говорите, что это происходит, когда ListObject сжимается и растет. Это также происходит, если ListObject остается того же размера?

...