Объект Excel :: Shape освобождается автоматически после того, как счетчик достиг 18 в списке <T> - PullRequest
0 голосов
/ 31 мая 2010

У меня есть надстройка для 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, не генерируя это исключение или не просматривая всю коллекцию?

1 Ответ

0 голосов
/ 31 мая 2010

К сожалению, в Excel много злых маленьких ошибок. И в пользовательском интерфейсе, и в VBA.

Одним из них является то, что когда пользовательская форма, созданная в Excel, имеет более {определенное количество} элементов управления, ссылка на элемент управления в виде Form.ControlName приведет к аварийному завершению работы Excel без какой-либо причины, но к тому же элементу в виде Form.Controls("ControlName") будет нормально работать.

То есть попробуйте вместо этого хранить имена строк фигур, каждый раз получая новый указатель, запрашивая у Worksheet::Shapes коллекцию имя.

...