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