Възстановяване на 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 г. Ако някой може да хвърли светлина върху това, ще съм много благодарен!


person Tryptamine42    schedule 11.06.2013    source източник
comment
Намерих документация за тази промяна: msdn.microsoft.com/en-us/library/ - това е доста скрито. Така контролите на InfoPath 2007 имплементират интерфейса Microsoft.Office.Interop.InfoPath.InfoPathControl, докато контролите на InfoPath 2010 имплементират InfoPathControl2. Последният има допълнителен метод, наречен RefreshState, който се извиква, когато контролата се опреснява. Документът msdn за този метод показва:   -  person Tryptamine42    schedule 11.06.2013
comment
В InfoPath 2007, когато възникне промяна в XML възела, към който е обвързана контролата, InfoPath извиква метода SaveState(), внедрен от контролата, така че InfoPath да може да унищожи контролата и контролата да може успешно да възстанови състоянието си, когато е реконструирана. В InfoPath 2010 бяха направени промени, така че ActiveX контролите да не се унищожават и реконструират винаги, когато възникне промяна в обвързания XML възел.   -  person Tryptamine42    schedule 11.06.2013


Отговори (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, докато новите копия на контролата се създават при всяка редакция, те се изхвърлят незабавно и така не се мотаят, заемайки ресурси. Въпреки че не съм много сигурен защо е приложен по този начин, очевидно е умишлено и затова трябва да е безопасно.

person Tryptamine42    schedule 11.06.2013