[C#.NET][Infopath 2007] 如何使用 GetListItems / How to use GetListItems
上篇[Infopath 2007] 如何利用 Web Service 更新文件庫 / How to use Web Service update to Sharepoint of Library
演練了使用CAML View查詢項目,這篇則是利用GetListItems方法
在MOSS預設所提供的Web Service裡有一隻GetListItems方法可以查詢到Item的資料,就像使用CAML View
馬上就來實作,
Step1.首先先開啟一個專案
Step2.加入Web Service參考,步驟可參考https://dotblogsfile.blob.core.windows.net/user/yc421206/1003/Infopath2007SharepointHowtoSubmittoSharp_5E5/2010-3-18%20%E4%B8%8B%E5%8D%88%2010-36-30_thumb.png
Step3.加入以下程式碼
private void button1_Click(object sender, EventArgs e)
{
WS_Lists.Lists myList = new WS_Lists.Lists();
myList.Credentials = System.Net.CredentialCache.DefaultCredentials;
myList.Url = "http://localhost/_vti_bin/lists.asmx";
//myservice.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx"
try
{
//定義參數
string listName = "{49AD94A9-71B6-47F1-9840-FAFA6ABD4A80}";
string viewName = "{8940B8B6-9F7A-405A-A39C-C5C817A2E73E}";
string rowLimit = "100";
//建立類別
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
System.Xml.XmlElement query = xmlDoc.CreateElement("Query");
System.Xml.XmlElement viewFields = xmlDoc.CreateElement("ViewFields");
System.Xml.XmlElement queryOptions = xmlDoc.CreateElement("QueryOptions");
//定義CAML
query.InnerXml = "<Query><Where><Neq><FieldRef Name='ID' /><Value Type='Counter'>0</Value></Neq></Where></Query></Query>";
viewFields.InnerXml = "";
queryOptions.InnerXml = "";
System.Xml.XmlNode nodes = myList.GetListItems(listName, viewName, query, viewFields, rowLimit, null, null);
foreach (System.Xml.XmlNode node in nodes)
{
if (node.Name == "rs:data")
{
for (int i = 0; i < node.ChildNodes.Count; i++)
{
if (node.ChildNodes[i].Name == "z:row")
{
string data = "";
data += node.ChildNodes[i].Attributes["ows_LinkFilename"].Value + ": ";
data += node.ChildNodes[i].Attributes["ows_owshiddenversion"].Value;
listBox1.Items.Add(data);
Debug.WriteLine(data);
}
}
}
}
}
catch (Exception ex)
{
Debug.Assert(ex == null,ex.Message);
Debug.Write(ex.Message);
}
}
4.執行結果
範例下載:GetListItems.rar
參考資料:http://msdn.microsoft.com/en-us/library/ms429658.aspx
如何使用 GetListItems
透過上述範例,我們可以得知透過Web Service可以很輕易的取得相關資訊,相當的方便。
接下來,試試從Infopath中是否也是能得到相同的結果?
很不幸的經過了一兩個小時的測試我一直不能成功,得到以下錯誤訊息:Query無效
Query字串完全都是Copy上述程式來的,為什麼搬來這裡就錯了@@?
上google查"Infopath GetListItems"關鍵字都會發現以下程式碼,這段Code似乎就是用來替代Web Service原本的GetListItems方法,起初不明白為什麼要再自己建立一個與GetListItems方法一模一樣的Web Service,後來因為在Infopath裡一直沒法建立連線,就抱著姑且一試的心態兜兜看,沒想到這段code在Infopath裡可以執行了。
[WebMethod()]
public XmlNode GetListItems(string listName, string viewID, string query, string viewFields, string rowLimit, string queryOptions, string webID)
{
SharePointListsWS.Lists service = GetWebServiceInstance(webID);
XmlNode queryElement = CreateNode("Query", query) as XmlNode;
XmlNode viewFieldsElement = CreateNode("ViewFields", viewFields) as XmlNode;
XmlNode queryOptionsElement = CreateNode("QueryOptions", queryOptions) as XmlNode;
return service.GetListItems(listName, viewID, queryElement, viewFieldsElement, rowLimit, queryOptionsElement, webID);
}
private SharePointListsWS.Lists GetWebServiceInstance(string webID)
{
SharePointListsWS.Lists service = new SharePointListsWS.Lists();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
service.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx";
return service;
}
private object CreateNode(string name, string innerXml)
{
XmlDocument document = new XmlDocument();
XmlNode node = document.CreateElement(name);
node.InnerXml = innerXml;
return node;
}
Infopath使用自訂的Web Service步驟可以參考 [Infopath 2007] 如何自定Web Service / How to Create Web Service for Form Service
建立好自訂的Web Service連線後,就可以取得資料結構了!
接下來在Infopath裡建立畫面
執行結果
範例下載:UpdateFolder-2.rar
參考資料:http://kb.cnblogs.com/a/1650015/
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET