У меня есть надстройка для Excel, написанная на C # 2.0, в которой я наблюдаю странное поведение. Обратите внимание, что такое поведение наблюдается только в Excel 2003, но НЕ в Excel 2007 или 2010.
Проблема:
Когда пользователь нажимает кнопку команды импорта, файл читается, и на листе создается / добавляется несколько фигур, используя метод Worksheet :: Shapes :: AddPicture (). Ссылка на эти объекты Shape хранится в общем списке:
List<Excel.Shape> list = new List<Excel.Shape>();
Все работает нормально, пока список не содержит менее 18 ссылок. Когда счет достигает 18 и добавляется новая ссылка на форму, первая, то есть @ index [0], освобождается. Я не могу вызвать какой-либо метод или свойство для этой ссылки, и вызов метода / свойства вызывает исключение COMException (0x800A1A8), т.е. объект требуется. Если я добавлю еще один, то ссылка @ [1] будет недоступна и т. Д.
Достаточно странно ... это происходит только с объектом Shape, т. Е. Если я добавлю в список один Shape, а затем 17 нулей, то этого не произойдет, пока не будет добавлено еще 17 объектов Shape.
У кого-нибудь есть идея, почему это происходит после того, как счет достигает 18?
Я подумал, что это может быть что-то с емкостью списка по умолчанию. Что-то вроде перемещения ссылок, во время которых они выпускаются, поэтому я инициализировал его с емкостью 1000, но все равно не повезло.
List<Excel.Shape> list = new List<Excel.Shape>(1000);
Любая идея ??
ОБНОВЛЕНО
Обнаружено, что исключение, сгенерированное при попытке доступа к объекту Shape через строковый индекс, играет определенную роль. Когда добавляется новый Shape, я проверяю существующий объект Shape, вызывая Worksheet :: Shapes :: Item (shapename). Это вызывает исключение, если форма не найдена. Если я удалю эту строку кода ... она работает нормально.
Есть ли другой способ проверить, существует ли Shape, не генерируя это исключение или не просматривая всю коллекцию?