使用XML+XSLT實現業務表單

銀河使者發表於2008-04-29
其實這是我的一個兩年前的專案中用到的東西,今天剛好翻以前的程式碼,看到,覺得也是自己想出來的東西,寫寫也無妨,哪怕是為了填充我空虛的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結構,下面是示例。

<!--現場會議記錄--&gt

  
  <!--會議名稱--&gt
  
   
      meet1
      false
   

   
      meet2
      false
   

   
      meet3
      false
   

  

  
  
  

  
  



3.設計表單的XSLT檔案,下面是示例。

                xmlns:msxsl="urn:schemas-microsoft-com:xslt"                 
                version="1.0" >
  

  
  <!--會議名稱--&gt
  




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指向它。
  XslCompiledTransform transForm = new XslCompiledTransform();
            string xsltemplatepath = TemplateHelper.GetFactoryFormXSLTemplatePath(m_FileType, m_DataRow.xsl_version);

            try
            {
                transForm.Load(xsltemplatepath);
                transForm.Transform(tempxmlfilepath, temphtmlfilepath);
            }
            catch(Exception ex)
            {
                LogError.Write(ex.Message + "
" + ex.StackTrace);
                MessageBox.Show("模板檔案載入出錯!");
                this.Close();
                return;
            }
            webBrowser1.Navigate(temphtmlfilepath);


6。在使用者點選儲存的時候,我通過XSLT中定義的JS程式碼,直接把使用者儲存的資料以XML的方式返回給winform的程式碼,然後儲存到資料庫中去。
Object validateresult = webBrowser1.Document.InvokeScript("validate");
            if (Convert.ToBoolean(validateresult) == true)
            {
                Object result = webBrowser1.Document.InvokeScript("savetoxml");
                if (Convert.ToBoolean(result) == true)
                {
                    this.Close();
                }
                else
                {
                    MessageBox.Show("儲存出錯", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    this.DialogResult = DialogResult.None;
                }
            }
            else
            {
                this.DialogResult = DialogResult.None;
            }


7。刪除剛才產生的臨時檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-255848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章