Восстановление экземпляра InfoPath .NET ActiveX - большая разница между InfoPath 2007/2010

Еще один день, еще одна странная проблема InfoPath...

Итак, я создаю пользовательские элементы управления ActiveX в C#, следуя этим учебникам - mhttp://blogs.msdn.com/b/infopath/archive/2006/12/18/creating-complex-infopath-controls-in-c-sharp.aspx и http://blogs.msdn.com/b/infopath/archive/2005/04/15/creating-an-infopath-custom-control-using-c-and-net.aspx. Обычно все просто, и у меня есть рабочие элементы управления, которые могут возвращать простые значения, xml и т. Д.

Однако в сообщениях msdn утверждается одна вещь: InfoPath будет неоднократно уничтожать и повторно создавать элементы управления при обновлении представления, и поэтому вы не сможете сохранить состояние в элементе управления. Я был удивлен, увидев, что в InfoPath 2010 я абсолютно могу сохранять состояние (поля, свойства, элементы управления.NET) в элементе управления и сохранять его в xml при отправке формы. Незнакомец событий, помещающий MessageBox.Show() в конструктор элемента управления, указывает, что элемент управления повторно создается повторно, но пользователю доступна только одна версия. Это меня несколько беспокоит, так как я не уверен, почему создаются дополнительные копии элемента управления, и это может вызвать серьезную проблему с производительностью, если элементы управления станут сложными

Итак, теперь я пробую это в InfoPath 2007 и обнаруживаю, что элемент управления ActiveX действительно разрушается и восстанавливается (уничтожая все состояния) каждый раз, когда данные изменяются. По сути, это означает, что все состояния нужно где-то хранить (возможно, в форме xml), чтобы заполнить элемент управления при его обновлении.

Это, очевидно, довольно серьезное различие между InfoPath 2007/2010, но я не могу найти никакой документации или какого-либо другого упоминания об этом явлении. Статьи, приведенные выше, довольно старые и поэтому правильно относятся к поведению 2007 года. Если кто-нибудь сможет пролить свет на это, я был бы очень благодарен!

1 ответ

Решение

Я нашел документацию по этому изменению: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.infopath.infopathcontrol2.refreshstate%28v=office.14%29.aspx - это довольно спрятано

Таким образом, элементы управления InfoPath 2007 реализуют интерфейс Microsoft.Office.Interop.InfoPath.InfoPathControl, а элементы управления InfoPath 2010 реализуют InfoPathControl2. Последний имеет дополнительный метод RefreshState, который вызывается при обновлении элемента управления. Документ MSDN для этого метода указывает:

"В InfoPath 2007, когда происходит изменение в узле XML, к которому привязан элемент управления, InfoPath вызывает метод SaveState(), реализованный элементом управления, чтобы InfoPath мог уничтожить элемент управления, и элемент управления может успешно восстановить свое состояние после восстановления. В InfoPath 2010 были внесены изменения, так что элементы управления ActiveX не всегда разрушаются и восстанавливаются при изменении связанного узла XML. Чтобы полностью реализовать это изменение, InfoPath 2010 нужен способ сообщить элементу управления, что изменение привязанного Произошел узел XML, и элемент управления должен обновить свое состояние, прочитав обновленную информацию в узле XML. Для этого разработчик элемента управления должен реализовать метод RefreshState() в элементе управления ".

Так что это определенное поведение.

Некоторые исследования с использованием метода Dispose() показывают, что в InfoPath 2010 новые экземпляры элемента управления создаются при каждом редактировании, они немедленно удаляются и поэтому не занимают ресурсы. Хотя я не совсем уверен, почему он реализован таким образом, он явно был намеренным и поэтому должен быть безопасным.

Другие вопросы по тегам