当行数== 1时,ListObject.Resize()使DataBodyRange为空

我正在尝试重置Excel ListObject中的列数。 我知道你可以添加和删除列一个接一个,但我想避免不必要的循环。 我反而决定使用Resize方法调整ListObject的大小。

这里是我使用的代码(其中OutputCasesTable是ListObject):

OutputCasesTable.DataBodyRange.Value2 = ""; OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray; 

上面的代码行似乎完美,但是,如果ListObject只包含1行数据,ListObject的DataBodyRange在第二行变为空 – 当我尝试更改其单元格的值时产生错误。 excel中的那一行仍然存在。

MSDN文档说明如下: “标题必须保留在同一行中,并且结果列表必须与原始列表重叠。列表必须包含标题行和至less一行数据。

现在我明白“一行数据”意味着该行包含值 – 所以这里的错误的原因必须是DataBodyRange单元格都不包含任何值(“”)。 但是,包含“”的两个数据行的表仍然没有数据行,是吗?

我知道完成这个任务有很多方法,但是我想明白为什么会发生这种情况。

临时解决scheme:将代码replace为只将值设置为将被删除的列中的空string(新列数以上的列)。 所有其他列将被replace:

 if(OutputCasesTable.ListColumns.Count - CaseCount > 0) OutputCasesTable.DataBodyRange.Offset[ColumnOffset: CaseCount].Resize[ColumnSize: OutputCasesTable.ListColumns.Count - CaseCount].Value2 = ""; OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray; 

我个人更喜欢看第一个解决scheme!

有什么我可以做,使它与空string工作? 或者你有更好的解决scheme?

最好的祝福,

Resize操作是杀死DataBodyRange的部分,显然Resize使用了一些内部逻辑,如果只有一行,并且所有的单元格都是空的,则删除所有的数据行。比一行,不要删除任何“。

我同意这个逻辑有点混乱。 如果你的问题是为什么微软这样做的话,我认为虽然它不一致,但它也许是一种整洁的方式 – 看起来模型,你正在使用一个空表,并且模型是没有办法的用graphics表示差异(表格不可能只有标题行)。

Resize来做它的工作,并发现一个单行空白表,它不能告诉你是否有一个零行表或单行表与空string。 如果它到达并find两个空行,这是明确的(他们必须是有意义的行)。

对于你的问题的解决方法部分,我会build议一个整洁的解决scheme,只是检查ListRows.Count属性,并添加一个,如果有必要。 请注意,您也可以使用Clear而不是将值2设置为空白; 对我来说,它更像是自我解释。

 OutputCasesTable.DataBodyRange.Clear(); OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); if (OutputCasesTable.ListRows.Count == 0) OutputCasesTable.ListRows.Add(); OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;