.NET-Excel ListObject在databind上自动调整大小

时间:2020-03-05 18:41:38  来源:igfitidea点击:

我正在使用Visual Studio Tools for Office(2008)开发Excel 2007加载项。我有一张纸上有几个ListObjects,它们在启动时绑定到数据表。绑定它们后,它们会自动正确调整大小。

当它们重新装订时,问题就来了。我在功能区栏上有一个自定义按钮,该按钮可以返回数据库并根据用户输入的某些条件检索不同的信息。这些新数据返回并重新绑定到ListObjects,但是,这一次它们没有调整大小,并且出现异常:

ListObject cannot be bound because it
  cannot be resized to fit the data. The
  ListObject failed to add new rows.
  This can be caused because of
  inability to move objects below of the
  list object.
  
  
    Inner exception: "Insert method of Range class failed"

    Reason: 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在缩小,不仅发生在增长时,都会发生此异常。

解决方案

回答

只是想了解一下它是否能为我们提供更多信息的想法:请尝试在异常行之前调整列表对象的大小,然后查看是否还会引发异常。如果不是,请尝试将范围对象调整为DataTable的新大小。

我们说这是在ListObject缩小和增长时发生的。如果ListObject保持相同大小,也会发生这种情况吗?

回答

如果其他任何人遇到此问题,我都找到了导致此异常的原因。只要列表对象不影响图纸上的任何其他对象,它们就会在绑定时自动调整大小。请记住,ListObjects仅会影响它们环绕的范围。

在我的情况下,位于另一个对象上方的列表对象的列数少于其下方的列表对象。假设顶部的ListObject有2列,底部的ListObject有3列。当顶部ListObject更改其行数时,由于它不在其基础Range中,因此无法对第三列进行任何更改。这意味着它无法移动第三列中的任何单元格,因此第二个ListObject无法正确移动,导致上面的异常。

更改ListObjects的位置以将较宽的列表放置在较小的列表上方可以很好地工作。按照上面的逻辑,这现在意味着较宽的ListObject可以移动第二个ListObject的所有列,并且由于较小的对象下方没有任何内容,因此它还可以移动所需的任何单元格。我对初始绑定没有任何麻烦的原因是两个ListObjects都是单个单元格。

由于在我的情况下这不是最佳选择,因此我可能会使用空列,或者尝试使用不可见列,如果可能的话,但至少原因现在已经清楚了。

回答

我有一个与refreshign多个列表对象类似的问题。我们将每个listObject.DataSource设置为null,然后从底部的listobject开始重新绑定,然后向上而不是顶部向下进行绑定。