Domanda

I am trying to read WorkflowTaskId and WorkflowListId fields from SharePoint Workflow Task List using SSOM C# but it says column doesn't exist While I can see both columns are displayed with values in U2U CAML Builder.

Query:

 SPQuery qry = new SPQuery();
 qry.Query = Query = @"<Where><Eq><FieldRef Name='ID' /><Value Type='Counter'>3118</Value></Eq></Where>";
 DataTable dt = new DataTable();
 dt = spList.GetItems(qry).GetDataTable();

Code to read:

for(int i=0 ; i < dt.Rows.Count; i++)
{
    DataRow row = dt.Rows[i];
    string WorkflowListId = row["WorkflowListId"].ToString();
    string WorkflowTaskId = row["WorkflowTaskId"].ToString();
}

Thanks in advance.

È stato utile?

Soluzione

I suggest to use SPListItemCollection class instead of DataTable.

Please try:

using (SPSite site = new SPSite("YOUR SITE URL"))
using (SPWeb web = site.OpenWeb())
{
    SPList list = web.Lists.TryGetList("Workflow Tasks");
    var query = new SPQuery
    {
        Query = String.Format("<Where><Eq><FieldRef Name='{0}' /><Value Type='Counter'>{1}</Value></Eq></Where>",
                    "ID", 3118)
    };
    var items = list.GetItems(query);

    SPListItem item = items[0];
    string WorkflowListId = item["WorkflowListId"].ToString();
    string WorkflowTaskId = item["WorkflowTaskId"].ToString();
}

Then you can create DataTable and populate row data from variables(WorkflowListId, WorkflowTaskId).

Also you can set ViewFields property to your query.

This code is working for me:

using (SPSite site = new SPSite("YOUR SITE URL"))
using (SPWeb web = site.OpenWeb())
{
    SPList list = web.Lists.TryGetList("Workflow Tasks");
    var query = new SPQuery
    {
        Query = String.Format("<Where><Eq><FieldRef Name='{0}' /><Value Type='Counter'>{1}</Value></Eq></Where>",
                    "ID", 3118)
    };
    query.ViewFields = string.Concat(
          "<FieldRef Name='Title' />",
          "<FieldRef Name='WorkflowListId' />",
          "<FieldRef Name='WorkflowTaskId' />");
    var items = list.GetItems(query);

    DataTable dt = new DataTable();
    dt = items.GetDataTable();
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        DataRow row = dt.Rows[i];
        string WorkflowListId = row["WorkflowListId"].ToString();
        Console.WriteLine(WorkflowListId);
    }            
}

Altri suggerimenti

We can add ViewFields in SPQuery to solve this issue. The following code for your reference.

using (SPSite site = new SPSite("http://sp2013/sites/team"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList spList = web.Lists.TryGetList("Workflow Tasks");
        SPQuery qry = new SPQuery();
        qry.Query = @"<Where><Eq><FieldRef Name='ID' /><Value Type='Counter'>3118</Value></Eq></Where>";
        qry.ViewFields = string.Concat(
                      "<FieldRef Name='Title' />",
                      "<FieldRef Name='WorkflowListId' />",
                      "<FieldRef Name='WorkflowTaskId' />");
        DataTable dt = new DataTable();
        dt = spList.GetItems(qry).GetDataTable();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            DataRow row = dt.Rows[i];
            string WorkflowListId = row["WorkflowListId"].ToString();
            string WorkflowTaskId = row["WorkflowTaskId"].ToString();
        }
    }
}

If you want to get list item by ID, I suggest you use the code below to achieve it.

using (SPSite site = new SPSite("http://sp2013/sites/team"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList spList = web.Lists.TryGetList("Workflow Tasks");
        SPQuery qry = new SPQuery();
        SPListItem item = spList.GetItemById(3118);
        string WorkflowListId = item["WorkflowListId"].ToString();
        string WorkflowTaskId = item["WorkflowTaskId"].ToString();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top