0

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

4

1 回答 1

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 文档指出:

“在 InfoPath 2007 中,当控件绑定的 XML 节点发生变化时,InfoPath 会调用控件实现的 SaveState() 方法,以便 InfoPath 可以销毁控件,并且控件可以在重建时成功恢复其状态. 在 InfoPath 2010 中,进行了更改,因此当绑定的 XML 节点发生更改时,ActiveX 控件并不总是被销毁和重建。要完全实现此更改,InfoPath 2010 需要一种方法来与控件进行通信,以告知对绑定的更改XML 节点已出现,控件应通过读取 XML 节点中的更新信息来刷新其状态。为此,控件的开发人员必须在控件上实现 RefreshState() 方法。

所以这是指定的行为。

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

于 2013-06-11T17:49:13.803 回答