InfoPath 2013基于工号字段值切换视图的技术求助
解决InfoPath 2013根据工号首字符切换视图的问题
我之前也踩过InfoPath里Form Load规则没法依赖后加载字段的坑,结合你已经有C#后台代码的情况,给你两个可行的方案,优先推荐代码实现的方式,更稳定可靠:
方案一:无代码字段变更规则(快速实现)
如果不想改代码,可以直接在表单设计里给工号字段加字段变更触发规则:
- 打开表单设计模式,找到工号对应的字段,右键选择「管理规则」
- 新建规则,触发条件选「字段值更改」
- 添加条件:使用InfoPath的字符串函数判断首字符,比如
substring(工号字段名, 1, 1) = "1"(替换成你实际的字段名) - 动作选择「切换视图」,指定为View A
- 重复上述步骤,分别添加首字符为"2"时切换到View B的规则,以此类推
这个方案的好处是不用写代码,但要注意字段的内部名称和视图名称必须完全匹配,而且如果工号是异步加载的,字段变更事件会自动触发。
方案二:C#后台代码实现(更灵活可靠)
既然你已经有后台代码,推荐用字段变更事件来监听工号的变化,这样能确保工号填充完成后立刻触发视图切换:
在表单的FormCode.cs文件中添加以下代码(记得替换成你实际的字段和视图名称):
public override void Initialize() { base.Initialize(); // 绑定工号字段的变更事件,替换成你表单里工号字段的内部名称 this.EmployeeID.Changed += EmployeeID_Changed; } private void EmployeeID_Changed(object sender, XmlEventArgs e) { string empId = this.EmployeeID.Value; // 避免空值或短字符串报错 if (string.IsNullOrEmpty(empId) || empId.Length < 1) return; char firstChar = empId[0]; // 根据首字符切换对应视图 switch (firstChar) { case '1': this.ViewInfos["View A"].SwitchView(); break; case '2': this.ViewInfos["View B"].SwitchView(); break; // 可扩展其他工种的视图逻辑 default: // 默认显示的视图,比如主视图 this.ViewInfos["Default View"].SwitchView(); break; } }
注意事项:
- 替换
EmployeeID为你工号字段的内部名称(不是显示名称),可以在设计模式右键字段→「属性」查看 - 视图名称要和你实际创建的View A、View B完全一致,InfoPath对视图名称的大小写是敏感的
- 如果工号是从外部数据源异步加载的,这个变更事件会在数据填充完成后自动触发,完美解决Form Load时字段未就绪的问题
内容的提问来源于stack exchange,提问作者Omegacron
相关产品推荐
相关产品推荐

