[C#.NET][Infopath 2007] 如何使用 GetListItems / How to use GetListItems

[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

2010-3-21 上午 02-42-38

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.執行結果

2010-3-21 上午 02-48-17

範例下載:GetListItems.rar

參考資料:http://msdn.microsoft.com/en-us/library/ms429658.aspx

 

如何使用 GetListItems

透過上述範例,我們可以得知透過Web Service可以很輕易的取得相關資訊,相當的方便。

接下來,試試從Infopath中是否也是能得到相同的結果?

很不幸的經過了一兩個小時的測試我一直不能成功,得到以下錯誤訊息:Query無效

Query字串完全都是Copy上述程式來的,為什麼搬來這裡就錯了@@?

2010-3-21 上午 03-04-34

上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連線後,就可以取得資料結構了!

2010-3-21 上午 03-09-39

接下來在Infopath裡建立畫面

2010-3-21 上午 03-10-56

 

 

執行結果

2010-3-21 上午 03-19-17

範例下載:UpdateFolder-2.rar

參考資料:http://kb.cnblogs.com/a/1650015/

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo