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