InfoPath .NET ActiveX控件重新实现 - InfoPath 2007/2010之间的巨大差异

时间:2013-06-11 09:49:12

标签: c# activex infopath infopath2010 infopath-2007

另一天,另一个奇怪的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年的行为。如果有人能够对此有所了解,我将非常感激!

1 个答案:

答案 0 :(得分:0)

我找到了一些有关此更改的文档: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 doc表示:

“在InfoPath 2007中,当控件绑定到的XML节点发生更改时,InfoPath会调用控件实现的SaveState()方法,以便InfoPath可以销毁控件,并且控件可以成功还原它在重建时的状态。在InfoPath 2010中,进行了更改,以便在更改绑定的XML节点时不会始终销毁和重构ActiveX控件。要完全实现此更改,InfoPath 2010需要一种与控件通信的方式已经发生了对绑定XML节点的更改,并且控件应该通过读取XML节点中的更新信息来刷新其状态。为此,控件的开发人员必须在控件上实现RefreshState()方法。

所以这是指定的行为。

使用Dispose()方法进行的一些调查表明,在InfoPath 2010中,虽然每次编辑都会实例化控件的新副本,但它们会立即处理,因此不会占用资源。虽然我不确定为什么它以这种方式实施,但显然是故意的,所以应该是安全的。