2010-05-31 44 views
0

我有一個用C#2.0編寫的Excel插件,其中遇到了一個奇怪的行爲。 請注意,這種行爲是在Excel 2003中,而不是在Excel 2007或2010只看到Excel :: Shape對象在計數達到18後自動釋放List <T>

問題:

當用戶點擊導入命令按鈕,文件讀取和一些使用Worksheet :: Shapes :: AddPicture()方法創建/添加到工作表中的形狀。這些形狀對象的引用都保存在一個通用的清單:

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

,一切工作正常,直到列表中有少於18個引用。當計數達到18時,添加一個新的形狀參考,第一個即@ index [0]被釋放。我無法調用該引用的任何方法或屬性,並調用方法/屬性會引發COMException(0x800A1A8),即Object Required。如果我再添加一個,那麼參考@ [1]不可訪問,等等。

奇怪的是......這隻發生在Shape對象上,即如果我添加一個Shape然後17個nulls到列表中,那麼這個不會發生,直到添加17個Shape對象。

有沒有人有一個想法,爲什麼它發生後,數到18?

我認爲這可能是列表的默認容量。像重新定位引用期間他們被釋放的東西,所以我初始化它的容量爲1000,但仍然沒有運氣。

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

任何想法?


更新

發現,雖然試圖通過一個字符串索引來訪問Shape對象玩一些角色生成的異常。當添加一個新的Shape時,我通過調用Worksheet :: Shapes :: Item(shapename)來檢查現有的Shape對象。如果未找到Shape,則會引發異常。如果我刪除這行代碼...它工作正常。

是否有另一種方法檢查一個Shape是否存在,而不會產生這個異常或迭代整個集合?

回答

0

不幸的是,Excel中有許多邪惡的小錯誤。在用戶界面和VBA中。

其中之一是,當在Excel中創建的用戶表單中有超過{一定數量}的控件時,引用Form.ControlName形式的控件將導致Excel無故崩潰,但訪問相同的控件Form.Controls("ControlName")的形式將正常工作。

也就是說,嘗試存儲形狀的字符串名稱,而不是每次需要時都通過查詢Worksheet::Shapes集合來獲取新指針。

+0

感謝您的回答。我嘗試過,但仍然沒有運氣。當我嘗試使用存儲名稱訪問Shapes集合形狀集合時,它會引發異常,指出該對象不存在。 – A9S6 2010-05-31 13:10:43

+0

也許這是不存在的Shapes集合呢? 你可以手動遍歷形狀,通過點擊它們? – GSerg 2010-05-31 13:33:11

+0

是的Shapes集合存在,因爲正如我所說的,形狀在添加18個對象後被釋放。所以我可以訪問其他Shape對象,但不能添加之前添加的對象。 – A9S6 2010-05-31 14:22:10