代码之家  ›  专栏  ›  技术社区  ›  goric

.NET-在数据绑定上自动调整Excel ListObject

  •  7
  • goric  · 技术社区  · 18 年前

    我正在使用Visual Studio Tools for Office(2008)开发Excel2007外接程序。我有一个工作表,上面有几个ListObjects,它们在启动时绑定到数据表。绑定后,它们会正确地自动调整大小。

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

    无法绑定ListObject,因为它 无法调整大小以适应数据。这个 ListObject未能添加新行。 这可能是由于 无法将对象移动到 列表对象。

    内部异常:“范围类的insert方法失败”
    原因:microsoft.office.tools.excel.failurereason.couldnotResizeListObject

    我在谷歌或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正在收缩,也会发生这种异常,而不仅仅是当它增长时。

    3 回复  |  直到 17 年前
        1
  •  4
  •   goric    18 年前

    如果其他人有这个问题,我已经找到了这个异常的原因。ListObjects将在绑定时自动重新调整大小,只要它们不影响工作表上的任何其他对象。请记住,ListObjects只能影响其环绕的范围。

    在我的例子中,另一个上面的列表对象的列比它下面的少。假设顶部的listObject有2列,底部的listObject有3列。当TopListObject更改其行数时,它无法对第三列进行任何更改,因为它不在其基础范围内。这意味着它不能移动第三列中的任何单元格,因此第二个listObject不能被正确移动,这导致了上面的异常。

    改变listObjects的位置,将宽的放置在小的上面,效果很好。按照上面的逻辑,这意味着更宽的listObject可以移动第二个listObject的所有列,并且由于在较小的列下面没有任何内容,所以它也可以移动任何必要的单元格。我在初始绑定上没有遇到任何问题的原因是两个listObjects都是一个单元格。

    因为在我的例子中这不是最佳的,如果可能的话,我可能会使用空列或者尝试使用不可见的列,但至少原因现在已经清楚了。

        2
  •  1
  •   Ivan    17 年前

    对于refreshign multiple listobjects,我有一个类似的问题。我们正在设置每个listObject.datasource=null,然后从底部listObject重新绑定,并逐步向上而不是自上而下。

        3
  •  0
  •   Guy    18 年前

    只是一个想法,看看它是否提供了更多的信息:尝试在异常行之前调整列表对象的大小,看看它是否也会引发异常。如果没有,请尝试将range对象的大小调整为数据表的新大小。

    您说当ListObject收缩并增长时会发生这种情况。如果listObject保持相同的大小,还会发生这种情况吗?

    推荐文章