Infopath是Office中提供的一個(gè)部件,可以方便快捷的處理一些表單。比較常見(jiàn)的使用就是會(huì )計可以利用Infopath制作一個(gè)表單模板,需要報銷(xiāo)的人直接填寫(xiě)就可以了,填寫(xiě)好的表單可以xml的格式保存為本地的一個(gè)表單文件。
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ同時(shí)也可以將Infopath表單模板在web頁(yè)面上來(lái)呈現和填寫(xiě)。在MOSS中提供了
InfoPath Forms Services功能可以方便的發(fā)布Infopath表單,當然在Web上使用Infopath在功能上會(huì )有一些限制。
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ本文要實(shí)現功能如下:編寫(xiě)一個(gè)Infopath表單,發(fā)布到Moss中(嵌入到原有的MOSS頁(yè)面中),當提交時(shí)將表單中的數據保存到數據庫中去。(模擬一個(gè)用戶(hù)編輯功能)
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ一、前期準備p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ要開(kāi)發(fā)一個(gè)包含C#代碼的Infopath表單有兩種方式:
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ1、安裝VSTO,裝好之后可以直接在VS2005 Team System中編輯表單模板和編寫(xiě)C#代碼
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ2、在
添加/刪除程序中修改VS2005的安裝,添加安裝
VSTA(Visual Studio 2005 Tools for Applications)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
我這里采用的是第二種方式p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
二、開(kāi)發(fā)Infopath表單模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
1、打開(kāi)Infopath新建一個(gè)表單模板:UserEditp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2、修改開(kāi)發(fā)部署環(huán)境:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.1 在工具-〉選項-〉設計中將語(yǔ)言改為C#p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.2 在工具-〉表單選項-〉編程中將語(yǔ)言改為C#p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.3 在工具-〉表單選項-〉兼容性-〉瀏覽器兼容(為了將表單可以發(fā)布在web頁(yè)面上)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.4 安全和信任p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
選擇“工具”-〉“表單選項”-〉“安全和信任”p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
因為我們在表單中使用了C#代碼,所以在“安全級別”方面,要選擇“完全信任”:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
與此同時(shí),因為表單有代碼,而且安全級別設置為“完全信任”,相應的,“表單模版簽名”要選擇“為此表單模版簽名”。在這個(gè)演示中,我們使用windows自己的證書(shū)。即選擇“創(chuàng )建證書(shū)”:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.5 設置在web中可以顯示哪些表單按鈕p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
在這里我們一定要設置提交按鈕,在下面編寫(xiě)表單時(shí),對控件的驗證只有當點(diǎn)擊提交按鈕時(shí)才會(huì )執行。如果是保存按鈕會(huì )忽略驗證強制保存的p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3、編寫(xiě)表單模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
頁(yè)面設計部分比較簡(jiǎn)單,都是一些所見(jiàn)即所得的操作,在設計的時(shí)候也可以給頁(yè)面控件加上驗證,比如不能為空,正則驗證等,功能還是很強大的。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
下圖是演示的頁(yè)面布局和簡(jiǎn)單的驗證操作,具體步驟我就不詳細列舉了:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
有一個(gè)要注意的地方就是Infopath中不支持password格式的輸入框,在google中查了一下,好像目前只能將字體設為Wingdings來(lái)部分達到效果p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
4、編寫(xiě)代碼p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
在工具-〉編程-〉Loading事件會(huì )直接打開(kāi)VS2005進(jìn)行代碼編寫(xiě)的。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
這里的代碼編寫(xiě)和普通的Asp.Net比較類(lèi)似,要注意的主要有兩個(gè)方面:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
a、對Infopath中的表單控件值的存取都要使用類(lèi)似xml的方式:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtID", NamespaceManager).SetValue(memberId);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
通過(guò)內置的MainDataSource對象來(lái)存取p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
b、使用頁(yè)面對象的方法(如取得頁(yè)面的輸入參數):p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
memberId = System.Web.HttpContext.Current.Request.QueryString.Get("ID");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
當然首先要添加System.Web的引用p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
FormEvents_Loading事件的代碼如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Codep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
publicp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
void FormEvents_Loading(object sender, LoadingEventArgs e)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
string memberId =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
string.Empty;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
tryp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
memberId = System.Web.HttpContext.Current.Request.QueryString.Get("ID");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
if (string.IsNullOrEmpty(memberId))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
memberId =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"1";p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtID", NamespaceManager).SetValue(memberId);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
using (SqlConnection connection =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlConnection("server=***;User ID=***;Password=***;database=****;Connection Reset=FALSE"))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
SqlDataAdapter sqlData =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlDataAdapter("select * from member where memberid="p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ memberId, connection);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
DataTable dt =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new DataTable();p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
sqlData.Fill(dt);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
if (dt.Rows.Count >p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
0)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtName", NamespaceManager).SetValue(dt.Rows[0]["Name"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPassword", NamespaceManager).SetValue(dt.Rows[0]["Password"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPhone", NamespaceManager).SetValue(dt.Rows[0]["Tel"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
catch (Exception ex)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtMessage", NamespaceManager).SetValue(ex.ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
代碼比較簡(jiǎn)單:一開(kāi)始取得前一個(gè)頁(yè)面傳遞的ID值,然后根據這個(gè)ID從數據庫中取得用戶(hù)信息,顯示在Infopath的控件中供修改。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
同理,我們還要寫(xiě)一個(gè)submit事件,當提交時(shí)將修改后的值保存到數據庫中去:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Codep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
publicp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
void FormEvents_Submit(object sender, SubmitEventArgs e)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
tryp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
using (SqlConnection connection =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlConnection("server=****;User ID=****;Password=****;database=****;Connection Reset=FALSE"))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
string strSql =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"update member set name='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtName", NamespaceManager).Value +p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"', password='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPassword", NamespaceManager).Value +p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"', tel='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPhone", NamespaceManager).Valuep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"' where memberid="p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtID", NamespaceManager).Value;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
SqlDataAdapter sqlData =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlDataAdapter(strSql, connection);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
DataTable dt =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new DataTable();p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
sqlData.Fill(dt);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
// 如果提交操作成功,則設置p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
e.CancelableArgs.Cancel =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
false;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
//System.Web.HttpContext.Current.Response.Write("<script language='javascript'>alert('更新成功!');</script>");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
catch (Exception ex)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtMessage", NamespaceManager).SetValue(ex.ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
}p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
三、發(fā)布和部署Infopathp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
表單開(kāi)發(fā)好之后,下面就是要把它部署到MOSS上面去了p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
如果表單中沒(méi)有代碼,那可以非常方便的把模版發(fā)布到文檔庫中。如果有了代碼,那就只能有一種方式,就是需要管理員審批。原理是,表單作者將表單庫發(fā)布到SharePoint上,其實(shí)是把表單發(fā)布到一個(gè)管理員可以訪(fǎng)問(wèn)到的地方(比如網(wǎng)絡(luò )共享服務(wù)器)。管理員需要將表單模版上傳到管理中心的“管理表單”,確定將表單在“網(wǎng)站集”激活、可用。最后,管理員,需要在“網(wǎng)站集”上激活相應的表單模版。這樣的過(guò)程雖然非常復雜,但是對于管理員維護表單模版非常方便。將模版的使用及開(kāi)發(fā)、審核分開(kāi)。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
具體步驟如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
1、在Infopath中發(fā)布p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
文件-〉發(fā)布:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
具有或不具有Infopath Forms Services的Sharepoint服務(wù)器p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
然后一直下一步(選擇一個(gè)列表放置這個(gè)Infopath表單模板)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
一定要選擇:使用戶(hù)可以通過(guò)瀏覽器填寫(xiě)此表單p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2、激活此表單p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.1 進(jìn)入MOSS的管理中心-〉應用程序管理-〉上載表單模板:選擇我們在前一個(gè)步驟中發(fā)布的表單模板,以后當修改此表單后只需要在這一步驟中選擇升級就可以了,不需要進(jìn)行2.2的操作。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.2 進(jìn)入個(gè)人開(kāi)發(fā)的MOSS網(wǎng)站 網(wǎng)站操作-〉網(wǎng)站設置-〉網(wǎng)站集功能 激活UserEdit這個(gè)功能,激活后會(huì )自動(dòng)將這個(gè)表單模板放到個(gè)人網(wǎng)站的/FormServerTemplates(表單庫模板)目錄下p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
(之后可以添加此類(lèi)型的表單庫,在表單庫設置中:高級-〉允許管理內容類(lèi)型 顯示為網(wǎng)頁(yè),從現有網(wǎng)站內容類(lèi)型添加。此演示中不需要使用此功能)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3、在MOSS頁(yè)面中嵌入此表單模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
常規的MOSS中的表單都是作為一個(gè)單獨的頁(yè)面呈現的,如果需要把它嵌入在原有的MOSS頁(yè)面中,需要進(jìn)行一些特殊處理p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.1 在web.config中注冊:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<SafeControl Assembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.Office.InfoPath.Server.Controls" TypeName="*" Safe="True"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
/>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.2 在MOSS頁(yè)面的頭部加入引用:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<%@ Register Tagprefix="InfoPath" Namespace="Microsoft.Office.InfoPath.Server.Controls" Assembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
%>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.3 在頁(yè)面需要的位置加入表單:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<InfoPath:XmlFormView XsnLocation="/FormServerTemplates/UserEdit[1].xsn" ShowFooter="false" id="FormControl" Style="width:100%;" runat="server"/>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
加入之后的效果如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
也可以進(jìn)行正常的驗證操作了,當提交時(shí)會(huì )把值保存到數據庫中。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
后記:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Infopath使用的方式很多,本文只是提供了一個(gè)可能的實(shí)現方式,希望對大家有用,如果有更好的方式也歡迎指出。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
轉載:http://www.cnblogs.com/dujun0618/articles/1140130.html