翻譯:實現多級聯動的下拉式列表
原文:http://blogs.msdn.com/infopath/archive/2006/10/12/cascading-dropdowns-in-browser-forms.aspx
如果你使用Office InfoPath用戶端軟體去建立解決方案,很方便地去使用“篩選”功能,去篩選下拉式清單方塊的值,但是“篩選”功能在基於瀏覽器的模板中是用不起來的,那麼我們怎麼去完成同樣的功能呢?
通過建立帶參數的Web Service的方法我們就可以完成這個不可能的任務,你可以把這些基於Web Service的方法以“資料連線”的形式加入模板,當一個下拉式清單方塊值發生變化時來執行這些查詢。當這個查詢設定好後,簡單地執行這個“資料連線”的查詢就可以獲得相關的資料。 這個例子,需要去串連到SQL SERVER的Northwind樣本資料庫和Visual Studio。 首先,讓我們去建立這個Web Service,其中包括2個方法。
Step 1:開啟網站
- 開啟 VS
- 從 “檔案”(File) 菜單中, 選擇 “開啟”(Open) 然後再選擇 “網站”(Web Site)
- 選擇“檔案系統” (File System) 然後瀏覽到 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS
注意: 本樣本選擇了 LAYOUTS 檔案夾, 這意味著這個 web service 對所有的網站都是可見的. 如果你想你的Web Service對某個特定的網站可見,你可以開啟這個目錄
C:\Inetpub\wwwroot\wss\VirtualDirectories\80
- 點擊開啟(Open)
- 在解決方案瀏覽器中(Solution Explorer), 右擊這個網站選擇建立一個新的檔案夾。
- 重新命名這個檔案夾叫 WebServices
- 考慮到今後可能還會有其它Web Service放在這個檔案夾中,為了方便管理我們再建立一個子檔案夾:
- 在WebServices 右擊 選擇新檔案夾(New Folder)
- 重新命名這個檔案夾為 NorthwindTables
Step 2: 建立Web Service
- 右擊 NorthwindTables 選擇建立項目( Add New Item)
- 在模板對話方塊中選擇WEB服務(Web Service)
- 在命名框中把這個項目命名為: NorthwindTable.asmx
- 取消“將代碼放在單獨的檔案中”,點擊確定。
Step 3: 添加WEB方法
注意: 在這個樣本中, 假設 SQL Server 資料庫是與Microsoft Office SharePoint Server安裝在同一台機器中的。
- 給代碼添加“using” 如下:
using System.Data;using System.Data.SqlClient;
- 添加Web 方法如下,從Northwind 庫的 Customers 表中讀取CustomerID的值:
[WebMethod]public DataSet GetCustomers() { // 建立到Northwind 資料庫的串連 SqlConnection cn = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind"); // 建立一個data adapter 對象來執行SQL // statement to retrieve the customer ID values SqlDataAdapter da = new SqlDataAdapter("SELECT Customers.CustomerID FROM Customers Order By CustomerID", cn); // 建立DataSet來儲存 DataSet ds = new DataSet(); // 開啟串連 cn.Open(); // 填充資料 da.Fill(ds, "Customers"); // 關閉相關串連 cn.Close(); cn = null; da = null; return ds; }
- 如下添加web方法,從傳入的已選擇的客戶(Customer)中去讀取相關訂單資訊:
[WebMethod]public DataSet GetOrdersForSelectedCustomer(string strCustID) { // 建立到庫的串連 SqlConnection cn = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind"); //建立一個字串變數,以便儲存修改後的SQL語句 string strOrdersSQL = ""; //建立一個預設的SQL字串 string strOrdersOrigSQL = "SELECT * FROM Orders"; // 一些客戶ID的值包含單引號' 我們需要 // 把它替換成2個單引號,以便 // 系統可以正確地識別 strCustID = strCustID.Replace("'", "''"); // 把預設的SQL語句換成帶查詢參數的。 // 並且需要排序 strOrdersSQL = strOrdersOrigSQL + " Where CustomerID Like '%" + strCustID + "%' Order By OrderID"; // 建立一個Adapter對像去擷取OrderID的值。 SqlDataAdapter daOrders = new SqlDataAdapter(strOrdersSQL, cn); // 建立DataSet儲存資料 DataSet Ds = new DataSet(); // 開啟串連 cn.Open(); // 填充資料 daOrders.Fill(Ds, "Orders"); // 清理記憶體 cn.Close(); cn = null; daOrders = null; return Ds;}
- 產生(Build)並儲存項目。
Step 4: 測試這個Web Service
注意: 這個網站的應用程式集區的標識帳戶,必須對SQL SERVER這個資料庫具有存取權限才可以。
- 開啟瀏覽器並訪問http://%3cserver%3e/_layouts/WebServices/NorthwindTables/NorthwindTables.asmx (把 <server> 替換成你伺服器名稱)
- 你可以看到剛才我們建立的2個方法,和系統預設的 HelloWorld :
- 單擊 GetCustomers 然後點擊Invoke – 它會返回一組客戶ID的值。
- 單擊 GetOrdersForSelectedCustomer ,在 strCustID 文字框中輸入: BERGS 然後點擊查詢 – 它會返回 BERGS的所有訂單號。
Step 5: 建立INFOPATH表單
- 設計一個新的、空的、瀏覽器安全色的INFOPATH表單。
- 添加一個下拉式清單方塊並且命名為: SelectCustomer
- 添加另一個下拉式清單方塊並且命名為: SelectOrder
- 如下添加2個 “僅接受資料”類型的資料連線,並且串連到NorthwindTables 的 Web Service中去。
- GetCustomers:
- 開啟選項“在表單開啟時自動檢索資料” (“Automatically retrieve data when the form is opened”)
- GetOrdersForSelectedCustomer:
- 當需要使用樣本值時,填入 ALFKI 作為 strCustID 參數
- 取消選項“在表單開啟時自動檢索資料” (“Automatically retrieve data when the form is opened”)
- 設定SelectCustomer這個下拉框的屬性,其列表框項從外部資料源 GetCustomers 尋找值,欄位CustomerID 同時為其值和顯示名稱。
- 設定 SelectOrder 這個下拉框屬性,其列表框項從 GetOrdersForSelectedCustomer資料來源尋找值,同時使用 OrderID 欄位作為其值和顯示名稱。
- 在SelectCustomer這個下拉框上建立一個規則(Rule) 應用如下的操作:
- 設定域值:設定SelectOrder 域值為空白
- 設定域值:設定資料來源GetOrdersForSelectedCustomer 中的參數域(strCustID) 為主要資料源SelectCustomer 域的值。
- 使用資料連線進行查詢GetOrdersForSelectedCustomer
- 儲存這個模板到本地,檔案名稱為FilteredDrop-downs_IPFS.XSN
Step 6: 發布這個模板
- 發布這個模板到運行 InfoPath Form Services的伺服器
- 使用瀏覽器在點擊檔案庫中的建立
- 在SelectCustomer 控制項中選擇BERGS
- 點擊 SelectOrder – 只有 BERGS 的訂單被顯示出來
- 選擇不同的客戶ID注意訂單下拉框是否改變。
由Dosboy傾情翻譯