Сведения о вопросе

1234123213

03:55, 10th August, 2020

Теги

c#   .net   excel   data-binding   vsto    

.Нетто - Excel ListObject авто на привязку

Просмотров: 563   Ответов: 3

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

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

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

Внутреннее исключение: "Insert method of Range class failed"
Причина: 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 сжимается, а не только когда он растет.



  Сведения об ответе

lourence

05:04, 18th August, 2020

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

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

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

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


  Сведения об ответе

crush

03:52, 5th August, 2020

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


  Сведения об ответе

dumai

02:08, 26th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться