7

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

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

ListObject 无法绑定,因为无法调整其大小以适合数据。ListObject 未能添加新行。这可能是由于无法将对象移动到列表对象下方而导致的。

内部异常:“Range 类的插入方法失败”
原因: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 缩小时也会发生此异常,而不仅仅是在它增长时。

4

3 回答 3

4

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

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

更改 ListObjects 的位置以将较宽的对象放在较小的对象之上可以正常工作。按照上面的逻辑,现在这意味着较宽的 ListObject 可以移动第二个 ListObject 的所有列,并且由于在较小的 ListObject 下方没有任何内容,因此它也可以移动任何必要的单元格。我在初始绑定上没有遇到任何问题的原因是两个 ListObject 都是一个单元格。

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

于 2008-08-25T19:30:44.243 回答
1

我在刷新多个列表对象时遇到了类似的问题。我们设置每个 listObject.DataSource = null,然后从底部的 listobject 开始重新绑定,并按我们的方式向上而不是自上而下。

于 2009-03-18T16:33:36.650 回答
0

只是想尝试看看它是否为您提供更多信息:尝试在异常行之前调整列表对象的大小,看看是否也会引发异常。如果不是,请尝试将范围对象的大小调整为 DataTable 的新大小。

您说当 ListObject 缩小和增长时会发生这种情况。如果 ListObject 保持相同大小,也会发生这种情况吗?

于 2008-08-22T23:27:01.360 回答