.NET - Excel ListObject 在数据绑定上自动调整大小
Posted
技术标签:
【中文标题】.NET - Excel ListObject 在数据绑定上自动调整大小【英文标题】:.NET - Excel ListObject autosizing on databind 【发布时间】:2010-09-06 10:26:19 【问题描述】:我正在使用 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 缩小时也会发生此异常,而不仅仅是在其增长时。
【问题讨论】:
【参考方案1】:如果其他人遇到这个问题,我已经找到了这个异常的原因。 ListObjects 将在绑定时自动调整大小,只要它们不影响工作表上的任何其他对象。请记住,ListObjects 只能影响它们所环绕的范围。
在我的例子中,位于另一个上方的列表对象的列数少于其下方的列数。假设顶部 ListObject 有 2 列,底部 ListObject 有 3 列。当顶部 ListObject 更改其行数时,它无法对第三列进行任何更改,因为它不在其基础 Range 中。这意味着它无法移动第三列中的任何单元格,因此第二个 ListObject 无法正确移动,导致我上面的异常。
更改 ListObjects 的位置以将较宽的对象放在较小的对象之上可以正常工作。按照上面的逻辑,现在这意味着较宽的 ListObject 可以移动第二个 ListObject 的所有列,并且由于在较小的 ListObject 下方没有任何内容,因此它也可以移动任何必要的单元格。我在初始绑定时没有遇到任何问题的原因是两个 ListObject 都是一个单元格。
由于在我的情况下这不是最佳选择,如果可能的话,我可能会使用空列或尝试使用不可见的列,但至少现在原因很清楚了。
【讨论】:
【参考方案2】:我在刷新多个列表对象时遇到了类似的问题。我们设置每个 listObject.DataSource = null,然后从底部的 listobject 开始重新绑定,并按我们的方式向上而不是自上而下。
【讨论】:
【参考方案3】:只是一个想法,尝试看看它是否为您提供更多信息:尝试在异常行之前调整列表对象的大小,看看是否也会引发异常。如果不是,请尝试将范围对象的大小调整为 DataTable 的新大小。
您说当 ListObject 缩小和增长时会发生这种情况。如果 ListObject 保持相同大小,也会发生这种情况吗?
【讨论】:
以上是关于.NET - Excel ListObject 在数据绑定上自动调整大小的主要内容,如果未能解决你的问题,请参考以下文章
用熊猫将Excel工作表(Listobject)读入python
ListObject.Querytable 的 QueryTable_AfterRefresh 在 Excel 2016 中不起作用