Infopath表单控件视图切换与打印问题解决方案

在Infopath表单控件(FormControl)的开发过程中,可能会遇到视图切换和打印时的一些问题。尽管尝试这些功能的开发者并不多,但如果正在尝试,可能会遇到在方法内部连续切换视图和打印Infopath视图时的问题。表面上看,这似乎很简单,但实际上可能会遇到一些挑战。

尝试在代码中实现视图切换时,可能会遇到COM异常,错误信息提示视图尚未准备好。即使尝试使用Sleep延迟下一个视图的切换,也无法解决问题。这在项目即将完成时尤其令人烦恼,因为这是阻碍发布的唯一功能。

在这种情况下,使用FormControlContextChanged事件非常有用。这个事件是异步的,它不会在上下文节点的每次更改时触发,而是在应用程序停止处理其他事件后触发。

在表单的InternalStartup事件中绑定到FormEvents_ContextChanged事件。这个事件在SwitchView方法切换视图并获得表单上第一个控件的焦点时触发。这可能是切换视图时的最后一个事件触发。

为了触发下一个视图的切换,可以使用信号机制。从ContextChanged事件处理程序中,向表单控件发出切换到下一个视图的信号。这看起来很简单,但一旦完成编码,除非使用两个不同的BeginInvoke来正确地发出信号,否则它不会执行预期的工作。

首先,调用PrintFromBeginInvoke调用:

PrintInvokerDelegate del = PrintInvoker; del.BeginInvoke( null, null );

接下来,从另一个线程调用SwitchViewDelegate

BeginInvoke( new SwitchViewDelegate(SwitchView), new object[] {viewIndex} );

然后,AutoResetEvent在这里等待来自ContextChanged事件处理程序的信号。

还要确保在不使用上述步骤的情况下打印第一个视图,因为如果切换到相同的视图,ContextChanged事件不会触发。

为了节省纸张,可以通过将打印代码更改为ExporttoPDf来测试应用程序(可能需要安装Microsoft插件来实现这一点)。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485