我有一个用 C# 2.0 编写的 Excel 插件,我在其中遇到了一个奇怪的行为。请注意,此行为仅出现在 Excel 2003 中,而不出现在 Excel 2007 或 2010 中。
问题:
当用户单击导入命令按钮时,将读取文件并使用 Worksheet::Shapes::AddPicture() 方法创建/添加许多形状到工作表。对这些 Shape 对象的引用保存在通用列表中:
List<Excel.Shape> list = new List<Excel.Shape>();
一切正常,直到列表中的引用少于 18 个。当计数达到 18 并添加新的 Shape 引用时,第一个即 @index [0] 被释放。我无法在该引用上调用任何方法或属性,并且调用方法/属性会引发 COMException (0x800A1A8),即需要对象。如果我再添加一个,那么引用@[1] 就无法访问,依此类推。
够奇怪的......这仅发生在Shape 对象上,即如果我添加一个Shape,然后将17 个空值添加到列表中,那么在添加另外17 个Shape 对象之前不会发生这种情况。
有谁知道为什么会在计数达到 18 后发生?
我认为这可能与列表的默认容量有关。像重新定位它们被释放的引用,所以我用 1000 的容量初始化它,但仍然没有运气。
List<Excel.Shape> list = new List<Excel.Shape>(1000);
任何想法??
更新
发现尝试通过字符串索引访问Shape对象时产生的异常起到了一定的作用。添加新 Shape 时,我通过调用 Worksheet::Shapes::Item(shapename) 检查现有的 Shape 对象。如果找不到 Shape,则会引发异常。如果我删除这行代码......它工作正常。
是否有另一种方法可以检查 Shape 是否存在而不生成此异常或遍历整个集合?