簡體   English   中英

重新安裝InfoPath .NET ActiveX控件-InfoPath 2007/2010之間的巨大區別

[英]InfoPath .NET ActiveX control reinstantiation - big difference between InfoPath 2007/2010

改天,另一個奇怪的InfoPath問題...

因此,我將按照以下教程在C#中構建自定義ActiveX控件-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年的行為。如果有人可以對此有所了解,我將非常感激!

我找到了有關此更改的一些文檔: http : //msdn.microsoft.com/zh-cn/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中,雖然在每次編輯時都會實例化控件的新副本,但它們會被立即釋放,因此不會浪費資源。 雖然我不太確定為什么要采用這種方式實施,但顯然這是故意的,因此應該是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM