2008-08-21 13 views
7

Estoy desarrollando un complemento de Excel 2007 usando Visual Studio Tools para Office (2008). Tengo una hoja con varios ListObjects en ella, que están vinculados a datatables en el inicio. Cuando están vinculados, se autosize correctamente..NET - Excel ListObject autosizing en databind

El problema surge cuando se vuelven a vincular. Tengo un botón personalizado en la barra de cinta que vuelve a la base de datos y recupera información diferente según algunos criterios que ingresa el usuario. Estos nuevos datos se vuelve y se re-une a los ListObjects - sin embargo, esta vez no se redimensionan y me da una excepción:

ListObject no puede ser obligado porque no se puede cambiar de tamaño para ajustar los datos. El ListObject no pudo agregar nuevas filas. Esto puede deberse a la incapacidad de para mover objetos debajo del objeto de lista .

Excepción interna: "método Insert de la clase Range falló"
Motivo: Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

yo no era capaz de encontrar nada muy significativo en este error en Google o MSDN. He estado tratando de resolver esto por un tiempo, pero fue en vano.

estructura de código básica:

//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); 

Tenga en cuenta que esta excepción se produce incluso cuando el ListObject se está reduciendo, y no sólo cuando crece.

Respuesta

4

Si alguien más tiene este problema, he encontrado la causa de esta excepción. ListObjects cambiará de tamaño automáticamente en el enlace, siempre que no afecten a ningún otro objeto en la hoja. Tenga en cuenta que ListObjects solo puede afectar los rangos que envuelven.

En mi caso, el objeto de la lista que estaba encima del otro tenía menos columnas que la que está debajo. Digamos que el ListObject superior tenía 2 columnas, y el ListObject inferior tenía 3 columnas. Cuando el ListObject superior cambió su número de filas, no tenía la capacidad de realizar ningún cambio en la tercera columna, ya que no estaba en su Rango subyacente. Esto significa que no pudo desplazar ninguna celda en la tercera columna, por lo que el segundo ListObject no se pudo mover correctamente, lo que resultó en mi excepción anterior.

Cambiar las posiciones de los ListObjects para colocar el más ancho por encima del más pequeño funciona bien. Siguiendo la lógica anterior, esto ahora significa que el ListObject más amplio puede desplazar todas las columnas del segundo ListObject, y dado que no hay nada debajo del más pequeño, también puede desplazar las celdas necesarias. La razón por la que no tenía ningún problema con el enlace inicial es que ambos ListObjects eran una sola célula.

Dado que esto no es óptimo en mi caso, probablemente use columnas vacías o intente jugar con columnas invisibles si eso es posible, pero al menos la causa ahora está clara.

0

Solo una idea de algo que intentar ver si le da más información: intente redimensionar el objeto de la lista antes de la línea de excepción y vea si eso también arroja una excepción. De lo contrario, intente cambiar el tamaño del objeto de rango al nuevo tamaño de la DataTable.

Usted dice que esto sucede cuando ListObject se encoge y crece. ¿También sucede si ListObject sigue siendo del mismo tamaño?

1

Tengo un problema similar con refreshign varios listobjects. Estamos configurando cada listObject.DataSource = null, luego volviendo a enlazar desde el principio listobject y avanzando hacia arriba en lugar de hacia arriba.

Cuestiones relacionadas