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

当它们重新绑定时,问题就来了。我在功能区栏上有一个自定义按钮,可以返回数据库并根据用户输入的某些条件检索不同的信息。这个新数据返回并重新绑定到 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 缩小时也会发生此异常,而不仅仅是在其增大时。

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top