2010-05-31 1 views
0

У меня есть добавление Excel, написанное на C# 2.0, в котором я испытываю странное поведение. Обратите внимание, что такое поведение можно увидеть только в Excel 2003, а не в Excel 2007 или 2010Excel :: Объект формы получает освобождение автоматически после того, как счет достигает 18 в списке <T>

Выпуск:

Когда пользователь нажимает на кнопку команды импорта, файл считывается и ряд Формы создаются/добавляются на рабочий лист с использованием метода 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, я проверяю существующий объект Shape, вызывая Worksheet :: Shapes :: Item (shapename). Это вызывает исключение, если Shape не найден. Если я удалю эту строку кода ... она отлично работает.

Есть ли другой способ проверить, существует ли Shape без генерирования этого исключения или итерации по всей коллекции?

ответ

0

Есть много злых маленьких ошибок в Excel, к сожалению. И в UI, и в VBA.

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

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

+0

Спасибо за ответ. Я пытался, но все равно не повезло. Когда я пытаюсь получить доступ к коллекции Shape from Shapes с использованием сохраненного имени, он выдает исключение, говорящее, что объект не существует. – A9S6

+0

Может быть, это коллекция Shapes, которая не существует тогда? Можете ли вы прокручивать фигуры вручную, нажимая на них? – GSerg

+0

Да коллекция Shapes существует, потому что, как я уже сказал, Shapes освобождаются после добавления 18 объектов. Поэтому я могу получить доступ к другим объектам Shape, но не к ранее добавленным. – A9S6