• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Tony Qu
我的软件工作室
博客园    首页    新随笔    联系   管理     

InfoPath 2007中如何用js动态生成重复表中的行

最近在做一个基于InfoPath的考勤系统,顺便学习了一下如何在InfoPath编程,总体感觉没有什么难度,但在开发过程中遇到一个技术问题,即如何根据月份的天数在重复表中自动生成n行,原本以为重复表会有一个选项可以设置重复多少行,搞了半天没有,于是就research了一把。

首先要理解一点,对于InfoPath的重复表来说,要添加行等同于添加一个重复节点。在本系统中,my:DayAttendance中包含了重复结点my:DayAttendance,也就是说我要添加一行就必须想办法添加一个my:AttendanceItem结点。js中使用的是MSXML,要添加结点就得用XmlNode.insertBefore方法,InsertBefore有两个参数第一个是被添加的结点,而第二个参数是参考结点。但要注意,没有insertAfter,所以没有办法直接差到某个结点后面,如果要这么做得用算法解决。

提示:my是InfoPath的默认命名空间,InfoPath会自动声明该命名空间。

    var parent = XDocument.DOM.selectSingleNode("/my:WorkAttendanceCard/my:Attendance/my:DayAttendance");
    
    
//get first row
    var rowOne = parent.selectSingleNode("./my:AttendanceItem");

        
  
    
for(i=1;i<days;i++)
    
{
    
//clone the first row
    var rowClone = rowOne.cloneNode(true);

        
    
    
//append row to XML document
    parent.insertBefore(rowClone, rowOne);
    }

其实代码并不复杂,首先我必须拿到重复表的父节点,即my:DayAttendance,保存在parent中;然后对第一行做cloneNode操作,保存到rowClone中,当然克隆完成之后,你可以为rowClone加入适当的内容,最后用insertBefore把rowClone 添加到rowOne之前。

似乎代码已经可以用了,但如果你自己做一遍的话会发现一个问题,如果在OnLoad中调用的此段代码每次InfoPath表运行都会生成n行,如果人家已经填好数据了,就会莫名其妙多出来n-1行。为此,可以加入一行判断条件,判断是否已经添加了需要的行,如下:

if(parent.childNodes.length>20)
    
return;

如果parent下面已经有超过20行,就不添加了,当然这里的20行是自己定义的,你可以根据自己的业务逻辑改成适当的值。

版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
posted @ 2007-06-05 17:05  找事的狐狸  阅读(2476)  评论(4)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3