2008-08-21 2 views
7

Я разрабатываю надстройку Excel 2007 с помощью Visual Studio Tools for Office (2008). У меня есть один лист с несколькими ListObjects на нем, которые привязаны к datatables при запуске. Когда они связаны, они автоматически настраиваются..NET - Excel ListObject autosizing on databind

Проблема возникает, когда они повторно связаны. У меня есть пользовательская кнопка на ленточной панели, которая возвращается в базу данных и извлекает различную информацию на основе некоторых критериев, которые вводит пользователь. Эти новые данные возвращаются и вновь связаны с 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 сокращается, а не только тогда, когда он растет.

ответ

4

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

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

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

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

0

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

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

1

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

Смежные вопросы