Infopath是微軟Office辦公軟件家族中的成員之一它主要的功能是面向客戶端收集XML數據並按照預期定義的格式生成XML文件它以可視化表單的形式收集數據並且支持C#編程接口以及外部數據源等Infopath的使用避免了最終用戶以完全手寫的方式生成XML數據文件同時也可以統一XML文件的格式在MOSS系統和網站開發中被廣泛使用
使用Infopath開發一個XML前端表單頁面需要有幾個特定的步驟如編寫XML示例文件生成XML Schema文件在Infopath中導入主數據源設計Infopath表單呈現如果需要還可以給表單添加C#事件代碼如表單打開保存時所要執行的動作附加按鈕的執行動作等讀者如果對Infopath的開發有興趣可以單獨去研究本文主要介紹在Infopath中如何實現數據的有效性驗證
在Infopath中有三種方法可以實現數據的有效性驗證
使用Infopath的內置數據類型
給輸入項添加自定義數據驗證條件或驗證事件
通過給表單自定義按鈕添加規則或驗證事件來進行數據有效性驗證
使用Infopath內置數據類型進行數據的自動驗證
這是最簡單的數據驗證方法在Infopath中添加控件或給主數據源中的域指定控件的時候可以為控件的輸入指定數據類型如果沒有為Infopath指定單獨的主數據源那麼Infopath將按照你在表單中添加的控件來構建數據源結構如果在表單編輯之前已經指定了主數據源則控件所接受的數據類型依賴於它所綁定的數據源中域的數據類型數據源中域的數據類型可在編寫XML Schema文件時單獨指定如果沒有指定默認為String類型表示可接受任何類型的數據
在Infopath中右鍵單擊要設置數據有效性驗證的控件點擊屬性或者直接雙擊該控件在彈出的對話框中設置控件的數據類型如下圖 Infopath支持下列數據類型
文本(string)
整數(integer)
小數(double)
布爾(True/False)
超鏈接(anyURI)
日期(date)
時間(time)
日期和時間(datetime)
在屬性對話框中我們還可以設置數據的默認值以及數據格式等當設置了控件的數據類型後最終用戶在填寫表單時如果類型不匹配則Infopath會給出相應的提示信息如
使用自定義數據驗證條件或驗證事件進行數據有效性驗證
你可以在Infopath中設置自定義數據驗證條件或編寫自定義事件進行數據的有效性驗證這需要一些額外的編程開銷或計算機編程方面的知識
使用自定義數據驗證條件
右鍵單擊要設置數據有效性驗證的控件點擊屬性或者直接雙擊該控件在彈出的對話框中點擊數據驗證按鈕在彈出的對話框中點擊添加在數據驗證對話框中設置數據驗證條件並填寫當數據驗證失敗時屏幕的提示信息以及警告對話框要顯示的消息內容
Infopath已經集成了很多數據驗證條件方便用戶直接選擇如域中的值大於小於等於包含不包含等等如果你想定義自己的匹配模式可以選擇匹配模式或不匹配模式然後在第三個下拉列表中選擇選擇模式在彈出的對話框中編寫自定義模式正則表達式例如你想規定該域只能接受包含小數點的數字你可以編寫如下正則
?[
]*\
?[
]+
然後設置警告信息
使用自定義驗證事件
使用自定義驗證事件需要編寫C#代碼進行數據的有效性驗證因為Infopath內置了VSTA編程接口使得我們可以非常方便地通過Visual Studio為Infopath編寫C#代碼以完成一些特定的功能在這裡要注意一下編寫本文時我本機的開發環境是Visual Studio + Office 在安裝Office 時必須手動將Infopath項下的VSTA選項勾上否則Infopath默認是不支持VSTA編程接口的Infopath中的VSTA默認使用的Visual Studio 的開發環境讀者不需要特定去安裝Visual Studio 默認情況下VSTA會將所需的程序及環境配置好
右鍵單擊要設置數據有效性驗證的控件選擇編程Validating事件此時Infopath會聯系Visual Studio打開VSTA工程在VSTA工程中我們可以為事件添加自定義方法有一個地方需要說明默認情況下Infopath會以VBNET語言創建VSTA工程如果你想更改工程語言可以點擊工具選項在設計選項卡中將語言選為C#同時你還可以設置工程的默認保存位置如果之前你已經創建了VBNET語言的VSTA工程可以通過工具表單選項在編程選項卡中刪除代碼然後重新創建新的VSTA工程在此處也可以選擇本Infopath表單的VSTA工程的存放位置
我們在VSTA中添加如下代碼以實現我們在上例中限制只接受數字類型的數據驗證效果
public void field
_Validating(object sender
XmlValidatingEventArgs e)
{
if (!e
UndoRedo && e
Operation == XmlOperation
ValueChange)
{
// 獲取數據源中域的值
XPathNavigator root = MainDataSource
CreateNavigator();
string field
= root
SelectSingleNode(
//my:field
NamespaceManager)
Value;
// 檢查用戶輸入項是否匹配正則表達式
System
Text
RegularExpressions
Regex regEx = new System
Text
RegularExpressions
Regex(@
?[
]*\
?[
]+
);
if (!regEx
IsMatch(field
))
{
e
ReportError(e
Site
true
僅允許數字
);
}
}
}
保存代碼並關閉Visual Studio保存或發布編寫好的Infopath表單然後直接打開表單實例在所要驗證的域中輸入內容當驗證失敗時Infopath會按照驗證事件代碼中的要求彈出相應的提示
在按鈕上使用規則或驗證事件進行數據有效性驗證
在Infopath中除了上面介紹的兩種方法可以實現數據的有效性驗證外我們還可以通過給表單上的按鈕設置規則及驗證事件來驗證域的數據有效性
使用規則進行數據有效性驗證
例如表單中有一個文本框一個表達式框和一個按鈕我們想驗證用戶在文本框中輸入的值是否為一個數字並且將信息顯示在表達式框中按照下面的步驟給按鈕添加規則
右鍵單擊按鈕點擊
屬性
或者直接雙擊按鈕
在彈出的對話框中點擊
規則
按鈕
在
規則
對話框中點擊
添加
在
規則
對話框中點擊
添加操作
在
操作
對話框中
從
操作
下拉列表中選擇
設置域值
點擊
域
後面的按鈕
在彈出的對話框中選擇表達式框所綁定的域
點擊
確定
關閉對話框
保持
操作
對話框中
值
文本框為空
點擊
確定
關閉
然後關閉
規則
對話框
此時在
規則
對話框中已經添加了一條新的規則
其作用是當按鈕點擊時清空表達式框中的值
按照前面的步驟再添加一條規則
同樣綁定到表達式框上
並將值設置成
僅允許數字
給規則
設置條件
在
條件
對話框中
選擇要進行驗證的域(此處應該是文本框所對應的域)
然後選擇
不匹配模式
同時設置匹配的正則表達式為
?[]*\?[]+
確定並關閉所有的對話框
當用戶打開表單實例時在文本框中輸入非數字然後點擊按鈕此時表達式框中會出現相應提示如果用戶輸入的內容符合驗證規則則表達式框中的內容被清空
在按鈕上使用驗證事件進行數據有效性驗證
右鍵單擊按鈕點擊屬性或者直接雙擊按鈕在屬性對話框中點擊編輯表單代碼在VSTA工程代碼中已經新添加了一個按鈕事件添加下面的代碼
public void CTRL
_
_Clicked(object sender
ClickedEventArgs e)
{
// 獲取表單數據源根節點的引用
XPathNavigator root = MainDataSource
CreateNavigator();
// 清空表達式框中的內容
root
SelectSingleNode(
my:field
NamespaceManager)
SetValue(
);
// 檢查文本框中的值是否為數字
並且在表達式框中顯示提示信息
string field
= root
SelectSingleNode(
my:field
NamespaceManager)
Value;
System
Text
RegularExpressions
Regex regEx = new System
Text
RegularExpressions
Regex(@
?[
]*\
?[
]+
);
if (!regEx
IsMatch(field
))
{
root
SelectSingleNode(
//my:field
NamespaceManager)
SetValue(
僅允許數字
);
}
}
注意在Infopath中所有的數據驗證僅會給出相應的提示信息用戶可以強制保存表單並忽略數據有效性驗證的提示信息另外本文C#代碼中所使用的主數據源節點名稱(如my:fieldmy:field等)因實際情況而異
From:http://tw.wingwit.com/Article/program/net/201311/12407.html