原創|其它|編輯:郝浩|2009-07-30 10:06:19.000|閱讀 2066 次
概述:VSTA(Visual Studio Tools for Applications )是微軟免費提供的方便開發人員定制應用程序的工具,它的作用和VBA類似,可以為應用程序的二次開發人員提供一個Visual Studio環境以及C#和VB.NET語言進行插件的開發,我們可以簡單的把它看成是VBA的.Net升級版,目前微軟的Office2007完全支持這項技術。下面我們詳細說明實現通過VSTA編程實現聯動下拉列表框的過程。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VSTA(Visual Studio Tools for Applications )是微軟免費提供的方便開發人員定制應用程序的工具,它的作用和VBA類似,可以為應用程序的二次開發人員提供一個Visual Studio環境以及C#和VB.NET語言進行插件的開發,我們可以簡單的把它看成是VBA的.Net升級版,目前微軟的Office2007完全支持這項技術。下面我們詳細說明實現通過VSTA編程實現聯動下拉列表框的過程。
通過規則實現聯動下拉列表框的方法要求必須以帶參數查詢的Web Service作為數據源,而下文中的方法對數據源沒有特殊要求。所以,我們選擇最簡單的SharePoint列表作為數據源。在SharePoint服務器上創建一個自定義列表Cities,為這個列表增加兩個欄,欄名為City和Province,類型都為“單行文本”。創建好列表后輸入一些測試數據,如下圖。
1. 我們創建一個與上一篇界面相同的表單,但是數據連接不同,也不需要添加規則。表單上同樣要放置兩個下拉列表框ddlb1和ddlb2。
2. 進入下拉列表框ddlb1的屬性對話框,在“數據”頁中,手動輸入兩個選項“四川”和“新 疆”。注意,這次要保留第一行默認的空值(顯示名稱“選擇…”)。
3. 在下拉列表框ddlb1屬性的“瀏覽器表單”頁,確認回發設置為“始終”。
4. 需要強調兩點:第一,創建表單模板時一定要鉤選“僅啟用瀏覽器兼容性功能”,或者也可以在設計表單時選擇菜單工具/表單選項,進入表單選項對話框,在“類別”中選擇“兼容性”,鉤選“設計一個可在瀏覽器或InfoPath中打開的表單模板”,作用與前者相同。
第二,在表單選項中選擇“安全和信任”,不鉤選“自動確定安全級別”,而選擇“完全信任”。因為如果在表單中加入VSTA編程,表單安全級別必須為“完全信任”,否則程序無法運行。因為表單安全級別為“完全信任”,發布表單步驟就與普通表單不同了,后面的文章會詳細說明發布安全級別為“完全信任”的表單的步驟。
5. 以上界面設計完畢后接著添加數據連接,啟動“數據連接向導”,
A. 選擇將SharePoint列表作為數據源。
B. 進入下一步,輸入SharePoint網站的地址;
C. 進入下一步,選擇列表Cities。
D. 進入下一步,選擇列表的域Province和Cities,如下圖。
E. 在向導最后一步,不要鉤選“在打開表單時自動檢索數據”,點擊“完成”按鈕。
數據連接創建完畢后,接著就要設置下拉列表框ddlb2的數據源。在ddlb2屬性對話框“數據”頁的“列表框項”下選擇“從外部數據源查找值”,將“數據源”設置為Cities,“項”設置為:
/dfs:myFields/dfs:dataFields/dfs:Cities
“值”為:@City
“顯示名稱”為:@City 要進行VSTA編程必須安裝VSTA軟件開發工具包,筆者使用的版本是Visual Studio 2005 Tools for Applications Software Development Kit (SDK),下載地址: 編程的思路是,系統偵聽下拉列表框ddlb1的Changed事件,一旦ddlb1的值發生變化,系統將重新檢索ddlb2的數據源,并按照ddlb1的值進行過濾,刪除不符合條件的值,只保留符合條件的值。下面用到的代碼源于國外ICT專家Frederik博客中的文章《HOW TO use Cascading Dropdown List Boxes within an InfoPath Web Form》(參考資料[2])。 下面詳細說明操作步驟。 下面對代碼中自定義函數作簡單說明。 參數 說明 dataConnectionName 數據連接名稱,該數據連接是下拉列表框ddlb2數據源的數據連接,在本例中值應為“Cities”。 可以從菜單工具/數據連接打開數據連接對話框。 dataSourceName 數據源名稱,指下拉列表框ddlb2的輔助數據源,應該與對應數據連接同名。可以從菜單視圖/任務窗格打開數據源視圖。 ForeignKey 設置過濾條件的Field的名稱,這個Field的設置值應該與下拉列表框ddlb1的值對應。在本例中該參數值應為“Province”。 CascadingDropDownDataSourceField 聯動的下級下拉列表框(bblb2)的XPath值,打開數據源視圖,選擇主數據源,右鍵點擊ddlb2,在彈出的菜單上選擇復制XPath可獲得該參數值,在本例中應為“/my:myFields/my:ddlb2”。 selectedMainValue 聯動的上級下拉列表框(ddlb1)的值,該函數會根據此值過濾ddlb2的選項。可通過ddlb1_Changed事件自帶參數e.NewValue獲得,該值即ddlb1變化后的新值。 repeatingNode 下拉列表框bblb2的數據源中作為選項Node的XPath值,可以從ddlb2的屬性對話框中看到,也可以在數據源視圖中“復制XPath”得到。在本例中應為“/dfs:myFields/dfs:dataFields/dfs:Cities”。 完成編寫代碼后,可以在VSTA環境中啟動調試,觀察運行結果。如果程序能在InfoPath客戶端中成功運行,下一步就可以向InfoPath Forms Services發布這個表單了。 前面提到過,由于本表單模板的安全級別是“完全信任”,因而發布過程不同于一般InfoPath表單,發布這種表單的過程稍微復雜一些,下面是發布過程。 1. 首先,啟動發布表單模板向導,選擇“具有或不具有InfoPath Form Services的SharePoint服務器”; 1. 上載表單模板。在SharePoint管理中心的應用程序管理頁面,點擊InfoPath Forms Services下面的“上載表單模板”;進入上載表單模板頁面,輸入前面發布的表單模板的位置和文件名“d:\ddlb2pub.xsn”。點擊上載按鈕,等待一會兒,會出現上載成功的頁面;點擊確定后,會進入管理表單模板頁面。這時會看到剛上載的表單模板ddlb2pub.xsn這一項,要注意這項的狀態。如果狀態為“就緒”,說明完全安裝成功。如果狀態為“正在安裝”,就要等一會兒在刷新頁面,直到狀態變為“就緒”為止。如果長時間處于“正在安裝”狀態,就要檢查“Windows SharePoint Services Timer”這個服務是否啟動,如果沒啟動則啟動它,或者手動執行命令“stsadm –o execadmsvcjobs”完成表單模板安裝。
完成上述步驟,InfoPath表單就設計好了,將這個表單模板保存為ddlb2.xsn。下一步就要進行VSTA編程來實現下拉列表框聯動。
第三步,VSTA編程。
string dataConnectionName = "Cities";
string dataSourceName = "Cities";
string ForeignKey = "Province";
string CascadingDropDownDataSourceField = "/my:myFields/my:ddlb2";
string selectedMainValue = e.NewValue;
string repeatingNode = "/dfs:myFields/dfs:dataFields/dfs:Cities";
//調用自定義函數重新填充ddlb2選項
PopulateCascadingDropDown(selectedMainValue, dataConnectionName,
dataSourceName, repeatingNode, ForeignKey,
CascadingDropDownDataSourceField);
在FormCode類中插入下面自定義函數的代碼。
private void PopulateCascadingDropDown(string selectedMainValue,
string dataConnectionName, string dataSourceName, string repeatingNode,
string ForeignKey, string CascadingDropDownDataSourceField)
{
// 清空ddlb2已選擇的值
XPathNavigator xnMain = this.MainDataSource.CreateNavigator();
xnMain.SelectSingleNode(CascadingDropDownDataSourceField,
this.NamespaceManager).SetValue(string.Empty);
// 重新檢索ddlb2數據源數據
DataConnection dcSecond = this.DataConnections[dataConnectionName];
dcSecond.Execute();
// 獲得ddlb2數據源的Navigator
XPathNavigator xnFD =
this.DataSources[dataSourceName].CreateNavigator();
// 設置過濾條件,既某一個Field不等于ddlb1的值
string xPathString = repeatingNode + "[@" + ForeignKey + "!='" +
selectedMainValue + "']";
// 獲得不符合過濾條件的節點集合,逐一刪除節點(未被刪除的節點就是需要的)
XPathNodeIterator items = xnFD.Select(xPathString,
this.NamespaceManager);
while (items.Count != 0)
{
xnFD.SelectSingleNode(xPathString,
this.NamespaceManager).DeleteSelf();
items = xnFD.Select(xPathString, this.NamespaceManager);
}
}
第四步,發布InfoPath表單。
2. 進入下一步,輸入SharePoint網站地址;
3. 進入下一步,一定要確認鉤選“使用戶可以通過瀏覽器填寫此表單”。
4. 進入下一步,填寫發布后模板存放的位置和文件名稱,本例我們填寫“d:\ddlb2pub.xsn”。
5. 進入下一步,再點擊下一步就可以發布了。
發布向導完成后,記住發布文件的位置,后面的操作會把這個文件上傳到SharePoint服務器上。
下面還需要以管理員身份登錄SharePoint管理中心上傳表單模板,并添加表單庫的內容類型,操作如下。第五步,應用內容類型。
2. 激活到網站集。表單模板就緒后,還需要激活表單模板。從表單模板ddlb2pub.xsn的下拉菜單選擇“激活到網站集”。在激活表單模板頁面中,網站集一項選擇要使用這個表單的網站集,點擊確定即可。
3. 添加內容類型。我們需要將這個內容類型應用到一個SharePoint列表或庫上(為了簡便,本例我們還是選用上一篇文章中創建的表單庫ddlb,但需要將該庫設置為“允許管理內容類型”)。在表單庫的設置頁面,在內容類型下面點擊“從現有網站內容類型添加;入添加內容類型頁面,從可用網站內容類型列表中選擇ddlb2pub,點擊“添加”按鈕,再點擊“確定”按鈕。
完成后該內容類型會列在表單庫的設置頁面的內容類型下面。如果不喜歡缺省名稱,可以點擊該內容類型,將名稱改為“VSTA表單”。
至此,內容類型添加完畢,下面可以測試了。在ddlb表單庫頁面,點擊“新建”下拉菜單,選擇“VSTA表單”。
上面步驟詳細說明了VSTA編程實現聯動下拉列表框的操作過程。這種方法的優點是對下拉列表框的數據源沒有限制,由于VSTA功能強大,還可以擴展更多的功能,靈活性是其它方法無可比擬的;但是,表單發布比較復雜,而且要求有管理員權限。
本文和上一篇文章中講述的方法都不能在重復表中實現聯動的下拉列表框,下一篇將講述如何在重復表中實現聯動的下拉列表框。源碼下載:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園