其实这是我的一个两年前的项目中用到的东西,今天刚好翻以前的代码,看到,觉得也是自己想出来的东西,写写也无妨,哪怕是为了填充我空虚的blog。这个是一个智能客户端,但是里面涉及的表单非常之多,统计一下,有200个张。本来也不是问题,用FORM一个一个画也能够画出来,但是这样有几个缺点,一方面导致智能客户端的dll变的比较大,每次更新的时候,都要下载整个dll;一方面分工不好分,原来那个公司那时候只有我用过winform,老板就把这个任务分配给我了。但是我一个人,要做那么多的表单,而且在比较短的时间内,也不是说不可能,太累了。我想想看能不能有其他方法。

当时XFORM的概念相当热,我也看了一些资料,觉得还是不太成熟,没有敢用。

后来看了微软office2007中的infopath,感觉功能非常强,它可以实现用infopath设计表单,然后用表单控件把表单嵌入到winform中去,并且可以实现表单中的数据加载和保存功能。但是唯一的遗憾就是如果要使用它,就必须要客户机器上安装office2007,这样就不太现实了。

最后来想到的是用xml+xslt是动态生成静态页面,然后把静态页面嵌入在winform的浏览器控件里面,并且屏蔽一些浏览器控件的一些属性,看起来就和winform设计的表单差不多了。这样就方便多了,我可以叫美工帮我设计表单,叫其他的asp.net的程序员帮忙做XML和XSLT以及里面的javascript脚本。后来的项目进展说明了,这种方式真的大大的提高了工作效率,也让我轻松了不少,嘿嘿,又偷懒了。


下面我说说具体的过程吧。
1。首先我在设计表的时候,把整个表单的内容设计成XML类型的字段,当然,其他需要搜索的字段还是要单独建字段,并且保存xslt文件的版本号。
2。设计表单的XML结构,下面是示例。

使用XML+XSLT实现业务表单<?xml version="1.0" encoding="utf-8" ?>
使用XML+XSLT实现业务表单
<!--现场会议记录-->
使用XML+XSLT实现业务表单
<meetnote>
使用XML+XSLT实现业务表单  
<enterprise></enterprise>
使用XML+XSLT实现业务表单  
<!--会议名称-->
使用XML+XSLT实现业务表单  
<meets>
使用XML+XSLT实现业务表单    
<meet>
使用XML+XSLT实现业务表单      
<name>meet1</name>
使用XML+XSLT实现业务表单      
<checked>false</checked>
使用XML+XSLT实现业务表单    
</meet>
使用XML+XSLT实现业务表单    
<meet>
使用XML+XSLT实现业务表单      
<name>meet2</name>
使用XML+XSLT实现业务表单      
<checked>false</checked>
使用XML+XSLT实现业务表单    
</meet>
使用XML+XSLT实现业务表单    
<meet>
使用XML+XSLT实现业务表单      
<name>meet3</name>
使用XML+XSLT实现业务表单      
<checked>false</checked>
使用XML+XSLT实现业务表单    
</meet>
使用XML+XSLT实现业务表单  
</meets>
使用XML+XSLT实现业务表单  
<compere />
使用XML+XSLT实现业务表单  
<recorder />
使用XML+XSLT实现业务表单  
<address />
使用XML+XSLT实现业务表单  
<meetdate />
使用XML+XSLT实现业务表单  
<content />
使用XML+XSLT实现业务表单
</meetnote>


3.设计表单的XSLT文件,下面是示例。

使用XML+XSLT实现业务表单<?xml version="1.0" encoding="utf-8"?>
使用XML+XSLT实现业务表单
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
使用XML+XSLT实现业务表单                xmlns:msxsl
="urn:schemas-microsoft-com:xslt"                 
使用XML+XSLT实现业务表单                version
="1.0" >
使用XML+XSLT实现业务表单  
<xsl:template match="/">
使用XML+XSLT实现业务表单    
<html>
使用XML+XSLT实现业务表单      
<head>
使用XML+XSLT实现业务表单        
<link href="../css/xmltable.css" rel="stylesheet" type="text/css" />
使用XML+XSLT实现业务表单        
<script language="javascript">
使用XML+XSLT实现业务表单          
//使用客户端日期JS脚本初始化
使用XML+XSLT实现业务表单

使用XML+XSLT实现业务表单          var date 
= new Date();
使用XML+XSLT实现业务表单          var   Fun_Year 
= date.getYear();
使用XML+XSLT实现业务表单          var   Fun_Month 
= date.getMonth()+1;
使用XML+XSLT实现业务表单          var   Fun_Day 
= date.getDate();
使用XML+XSLT实现业务表单        
</script>
使用XML+XSLT实现业务表单        
<script language="javascript" src="../javascript/calendar.js"></script>
使用XML+XSLT实现业务表单        
<script language="javascript" src="../javascript/check.js"></script>
使用XML+XSLT实现业务表单        
<script language="javascript" src="../javascript/common.js"></script>
使用XML+XSLT实现业务表单        
<script language="javascript">
使用XML+XSLT实现业务表单          function validate()
>



4。在XSLT文件中加入JS脚本,用户验证用户输入,收集表单数据,加载表单数据等。(这里涉及到JS代码和浏览器控件所在的winform窗体的代码的相互调用。)
1)首先把winform窗体的类加上这个属性[ComVisible(true)]

2) 在winform窗体里面写上public的方法

        //取得xml文件路径(供javascript调用)
        public string GetXMLPathForJava()
        {          
            return tempxmlfilepath;
        }
3)在XSLT文件里面的JS代码中调用这个方法
  //调用c#方法获取xml文件路径
         var xmlfilepath = window.external.GetXMLPathForJava();
4)在XSLT文件中定义JS方法
         //数据保存
          function savetoxml()
          {
         } 
5)在winform窗体中调用JS方法
 //调用JS方法
 Object result = webBrowser1.Document.InvokeScript("savetoxml");

5.在显示页面的时候,我先使用下面的代码把XSLT和XML转换成HTML文件,存放在临时文件夹中,然后把浏览器控件的URL指向它。

使用XML+XSLT实现业务表单  XslCompiledTransform transForm = new XslCompiledTransform();
使用XML+XSLT实现业务表单            
string xsltemplatepath = TemplateHelper.GetFactoryFormXSLTemplatePath(m_FileType, m_DataRow.xsl_version);
使用XML+XSLT实现业务表单
使用XML+XSLT实现业务表单            
try


6。在用户点击保存的时候,我通过XSLT中定义的JS代码,直接把用户保存的数据以XML的方式返回给winform的代码,然后保存到数据库中去。

使用XML+XSLT实现业务表单 Object validateresult = webBrowser1.Document.InvokeScript("validate");
使用XML+XSLT实现业务表单            
if (Convert.ToBoolean(validateresult) == true)
            }


7。删除刚才产生的临时文件。

相关文章:

  • 2021-08-15
  • 2022-12-23
  • 2022-02-18
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
  • 2021-09-14
  • 2022-12-23
猜你喜欢
  • 2022-03-10
  • 2021-11-25
  • 2022-01-12
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案