使用XML+XSLT實現業務表單
其實這是我的一個兩年前的專案中用到的東西,今天剛好翻以前的程式碼,看到,覺得也是自己想出來的東西,寫寫也無妨,哪怕是為了填充我空虛的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結構,下面是示例。
<!--現場會議記錄-->
<!--會議名稱-->
meet1
false
meet2
false
meet3
false
3.設計表單的XSLT檔案,下面是示例。
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
version="1.0" >
<!--會議名稱-->
checked
首次會議
checked
溝通會議
checked
末次會議
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。刪除剛才產生的臨時檔案。
當時XFORM的概念相當熱,我也看了一些資料,覺得還是不太成熟,沒有敢用。
後來看了微軟office2007中的infopath,感覺功能非常強,它可以實現用infopath設計表單,然後用表單控制元件把表單嵌入到 winform中去,並且可以實現表單中的資料載入和儲存功能。但是唯一的遺憾就是如果要使用它,就必須要客戶機器上安裝office2007,這樣就不太現實了。
最後來想到的是用xml+xslt是動態生成靜態頁面,然後把靜態頁面嵌入在winform的瀏覽器控制元件裡面,並且遮蔽一些瀏覽器控制元件的一些屬性,看起來就和winform設計的表單差不多了。這樣就方便多了,我可以叫美工幫我設計表單,叫其他的asp.net的程式設計師幫忙做XML和XSLT以及裡面的 javascript指令碼。後來的專案進展說明了,這種方式真的大大的提高了工作效率,也讓我輕鬆了不少,嘿嘿,又偷懶了。
下面我說說具體的過程吧。
1。首先我在設計表的時候,把整個表單的內容設計成XML型別的欄位,當然,其他需要搜尋的欄位還是要單獨建欄位,並且儲存xslt檔案的版本號。
2。設計表單的XML結構,下面是示例。
<!--現場會議記錄-->
<!--會議名稱-->
3.設計表單的XSLT檔案,下面是示例。
version="1.0" >
現場稽核會議記錄 |
受稽核方: |
會議名稱: |
主 持 人: 會議地點: |
記 錄 人: 會議時間: |
會議內容: |
<!--會議名稱-->
checked
首次會議
checked
溝通會議
checked
末次會議
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用angularjs實現表單驗證AngularJS
- 實現單項鍊表
- jquery實現重置表單jQuery
- 聊聊「訂單」業務的設計與實現
- 使用LocalStorage實現Form表單內容本地儲存ORM
- SpringBoot系列——附件管理:整合業務表單實現上傳、回顯、下載Spring Boot
- 使用jquery實現的清空表單元素程式碼例項jQuery
- 利用orm 在業務程式碼無感知下,實現實現分庫分表ORM
- 純CSS實現表單驗證CSS
- kettle 實現mysql單表增量同步MySql
- 【react】實現動態表單中巢狀動態表單React巢狀
- 使用GoldenGate 實現Oracle for Oracle 單向資料同步(實現表的DML操作同步)GoOracle
- Django實踐(二)——使用模型類定義資料表,實現表單頁面跳轉Django模型
- 使用 Drools 規則引擎實現業務邏輯
- 分欄報表-物品清單報表實現
- 使用filter_var()過濾表單,實現laravel登入介面FilterLaravel
- 決策表模式: 一種業務規則引擎實現方式模式
- 仿 ElmentUI 實現一個 Form 表單UIORM
- JS原生實現表單序列化JS
- 利用jQuery實現表單驗證功能jQuery
- 使用jQuery.form外掛,實現完美的表單非同步提交jQueryORM非同步
- 使用float,flex和tailwind實現同一個表單註冊效果FlexAI
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- 使用業務能力方法實現DDD戰略建模 - pulse
- 使用canvas實現簡單動畫Canvas動畫
- HTML 使用表單標籤實現註冊頁面的例項程式碼HTML
- 原生JS實現表單序列化serialize()JS
- 實現elementUI表單的全域性驗證UI
- 用slot和component實現表單共用
- 實現動態表單的一種思路
- 配置式表單渲染器的實現
- 使用 WebSphere Business Modeler 實現業務流程的直接部署Web
- 如何更好實現業務治理?
- 使用Spark\/BigDL高階機器學習實現壽險業務再發現 [session]Spark機器學習Session
- 使用CAS實現單點登入
- Promise的使用及簡單實現Promise
- 表單識別:準確快速實現紙質表格表單的電子化
- 前端表單進階之路:通過 Vue.js 實現表單可配置化前端Vue.js