在Infopath表单控件(FormControl)的开发过程中,可能会遇到视图切换和打印时的一些问题。尽管尝试这些功能的开发者并不多,但如果正在尝试,可能会遇到在方法内部连续切换视图和打印Infopath视图时的问题。表面上看,这似乎很简单,但实际上可能会遇到一些挑战。
尝试在代码中实现视图切换时,可能会遇到COM异常,错误信息提示视图尚未准备好。即使尝试使用Sleep延迟下一个视图的切换,也无法解决问题。这在项目即将完成时尤其令人烦恼,因为这是阻碍发布的唯一功能。
在这种情况下,使用FormControl
的ContextChanged
事件非常有用。这个事件是异步的,它不会在上下文节点的每次更改时触发,而是在应用程序停止处理其他事件后触发。
在表单的InternalStartup
事件中绑定到FormEvents_ContextChanged
事件。这个事件在SwitchView
方法切换视图并获得表单上第一个控件的焦点时触发。这可能是切换视图时的最后一个事件触发。
为了触发下一个视图的切换,可以使用信号机制。从ContextChanged
事件处理程序中,向表单控件发出切换到下一个视图的信号。这看起来很简单,但一旦完成编码,除非使用两个不同的BeginInvoke
来正确地发出信号,否则它不会执行预期的工作。
首先,调用PrintFrom
的BeginInvoke
调用:
PrintInvokerDelegate del = PrintInvoker;
del.BeginInvoke(
null,
null
);
接下来,从另一个线程调用SwitchViewDelegate
:
BeginInvoke(
new SwitchViewDelegate(SwitchView),
new object[] {viewIndex}
);
然后,AutoResetEvent
在这里等待来自ContextChanged
事件处理程序的信号。
还要确保在不使用上述步骤的情况下打印第一个视图,因为如果切换到相同的视图,ContextChanged
事件不会触发。
为了节省纸张,可以通过将打印代码更改为ExporttoPDf
来测试应用程序(可能需要安装Microsoft插件来实现这一点)。