在List <t> </t>中计数达到18后,Excel :: Shape对象自动释放

时间:2010-05-31 11:44:56

标签: excel interop clr comexception

我有一个用C#2.0编写的Excel插件,我遇到了一个奇怪的行为。请注意,这种行为只能在Excel 2003中看到,而不能在Excel 2007或2010中看到。

问题:

当用户单击导入命令按钮时,将读取一个文件,并使用Worksheet :: Shapes :: AddPicture()方法创建/添加一些Shapes到工作表。对这些Shape对象的引用保存在通用列表中:

List<Excel.Shape> list = new List<Excel.Shape>();

一切正常,直到列表少于18个引用。当计数达到18,并且添加了新的Shape引用时,释放第一个,即@ index [0]。我无法在该引用上调用任何方法或属性,并且调用方法/属性会抛出COMException(0x800A1A8),即Object Required。如果我再添加一个,那么引用@ [1]将无法访问,依此类推。

奇怪......仅在Shape对象中发生这种情况,即如果我向列表中添加一个Shape然后添加17个空值,那么这将不会发生,直到添加了17个Shape对象。

是否有人知道为什么在计数达到18后会发生这种情况?

我认为它可能是List的默认容量。有点像重新定位它们被释放的引用,所以我初始化它的容量为1000但仍然没有运气。

List<Excel.Shape> list = new List<Excel.Shape>(1000);

任何想法?


已更新

发现尝试通过字符串索引访问Shape对象时生成的异常正在起作用。添加新的Shape时,我通过调用Worksheet :: Shapes :: Item(shapename)来检查现有的Shape对象。如果未找到Shape,则会引发异常。如果我删除这行代码......它工作正常。

是否存在另一种检查Shape是否存在而不生成此异常或迭代整个集合的方法?

1 个答案:

答案 0 :(得分:0)

不幸的是,Excel中有许多邪恶的小错误。在UI和VBA中都有。

其中之一是当在Excel中创建的用户表单具有超过{一定数量}的控件时,引用Form.ControlName形式的控件将导致Excel无缘无故崩溃,但访问Form.Controls("ControlName")形式的相同控件可以正常工作。

也就是说,尝试存储形状的字符串名称,每次需要时通过查询名称的Worksheet::Shapes集合获取新指针。