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