Автоматическое изменение размера объекта списка .NET - Excel в привязке данных

StackOverflow https://stackoverflow.com/questions/20465

Вопрос

Я разрабатываю надстройку 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 остается того же размера?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top