DraftProject.FieldValues property

Gets the custom field values for the draft project.

Namespace:  Microsoft.ProjectServer.Client
Assembly:  Microsoft.ProjectServer.Client (in Microsoft.ProjectServer.Client.dll)

Syntax

'Declaration
Public ReadOnly Property FieldValues As Dictionary(Of String, Object)
    Get
'Usage
Dim instance As DraftProject
Dim value As Dictionary(Of String, Object)

value = instance.FieldValues
public Dictionary<string, Object> FieldValues { get; }

Property value

Type: System.Collections.Generic.Dictionary<String, Object>
A set of key-value pairs for custom field values, where the key is the internal custom field name, and the value is either the custom field value or the internal name of a lookup table entry.

Examples

The following code example checks out the specified enterprise project and then queries the draft project for its collection of custom fields. The code example lists the GUID and name of the project, the name and value of each custom field, and the internal name of each custom field in the project as the key in a key-value pair. If the custom field uses a lookup table, the FieldValues item contains the internal name of the lookup table entry. If the custom field is a multivalue text field, the example lists the value and internal name of each lookup table entry for that custom field in the project. If the custom field does not use a lookup table, the value is simply the custom field value.

The internal name of a custom field is a string with the value "Custom_[GUID]", for example, Custom_9d77d62aa92e4d40adc8446c90eb7456. The internal name of a lookup table entry is a string with the value "Entry_[GUID]", for example, Entry_4a2750309d91e21193f90021704e28a0.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ProjectServer.Client;
using Microsoft.SharePoint.Client;

namespace GetDraftProjectFieldValues
{
    class Program
    {
        private const string pwaPath = "https://ServerName/pwa";    // Change the path for Project Web App.
        private static string projName = string.Empty;

        // Set the Project Server client context.
        private static ProjectContext projContext;

        static void Main(string[] args)
        {
            if (!ParseCommandLine(args))
            {
                Usage();
                ExitApp(string.Empty);
            }

            Dictionary<string, object> projDict = new Dictionary<string, object>();
            projContext = new ProjectContext(pwaPath);

            // Get the list of published projects in Project Web App.
            var pubProjects = projContext.LoadQuery(projContext.Projects
                .Where(p => p.IsEnterpriseProject == true
                         && p.Name == projName));
            projContext.ExecuteQuery();

            if (pubProjects.Count() < 1)
            {
                ExitApp("No enterprise project name: " + projName);
            }

            Console.WriteLine("\t\tDraft project ID\t:\tProject name");

            foreach (PublishedProject pubProj in pubProjects)
            {
                // Check out the project.
                if (!pubProj.IsCheckedOut)
                {
                    DraftProject draftProj = pubProj.CheckOut().IncludeCustomFields;
                    projContext.Load(draftProj);
                    projContext.Load(draftProj.IncludeCustomFields);
                    projContext.ExecuteQuery();

                    Console.WriteLine("\n{0} :\t{1}", draftProj.Id.ToString(), draftProj.Name);

                    projDict = draftProj.FieldValues;

                    // Initialize variables to compare with custom field types:
                    string textValue = "";                  // TEXT - no lookup table
                    String[] lutTextValues = { "" };        // TEXT - lookup table
                    DateTime dateValue = DateTime.MinValue; // DATE - no lookup table

                    foreach (KeyValuePair<string, object> kvp in projDict)
                    {
                        object oVal = kvp.Value;
                        string keyStr = kvp.Key;

                        var projCFs = projContext.LoadQuery(draftProj.CustomFields
                            .Where(cf => cf.InternalName == keyStr));
                        projContext.ExecuteQuery();

                        WriteCustomFieldName(projCFs.First().Name);
                        Console.WriteLine("; FieldType = {0};\n\tInternalName = {1}",
                            projCFs.First().FieldType.ToString(), keyStr);

                        // Check whether the custom field is a simple text field.
                        if (object.ReferenceEquals(oVal.GetType(), textValue.GetType()))
                        {
                            textValue = (string)oVal;
                            Console.WriteLine("\tSingle-line string value = {0}", textValue.ToString());
                        }
                        // Check whether the custom field is a text (or multivalue text) field from a lookup table.
                        else if (object.ReferenceEquals(oVal.GetType(), lutTextValues.GetType()))
                        {
                            projContext.Load(projCFs.First().LookupTable);
                            projContext.ExecuteQuery();
                            string lutName = projCFs.First().LookupTable.Name;

                            WriteLookupTableName(lutName);

                            var luts = projContext.LoadQuery(projContext.LookupTables
                                .Where(lut => lut.Name == lutName));
                            projContext.ExecuteQuery();

                            lutTextValues = (string[])oVal;

                            for (var j = 0; j < lutTextValues.Count(); j++)
                            {
                                var entries = projContext.LoadQuery(luts.First().Entries
                                    .Where(e => e.InternalName == lutTextValues[j]));
                                projContext.ExecuteQuery();
                                Console.WriteLine("\t    Entry({0}): String value = {1};\n\t\t  InternalName = {2}",
                                    j, entries.First().FullValue, lutTextValues[j]);
                            }
                        }
                        // Check whether the custom field is a date.
                        else if (object.ReferenceEquals(oVal.GetType(), dateValue.GetType()))
                        {
                            dateValue = (DateTime)oVal;

                            Console.WriteLine("\tDate value = {0}", dateValue.ToString());
                        }
                        // Add other cases for cost, duration, flag, and number custom fields. 
                    }

                    // Check in and publish the project.
                    draftProj.Publish(true);
                    projContext.ExecuteQuery();
                }
                ExitApp(string.Empty);
            }
        }

        private static void WriteCustomFieldName(string cfName)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("\n    Custom field: '{0}'", cfName);
            Console.ResetColor();
        }

        private static void WriteLookupTableName(string lutName)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("\tLookup table: {0}", lutName);
            Console.ResetColor();
        }

        // Parse the command line. Return true if there are no errors.
        private static bool ParseCommandLine(string[] args)
        {
            bool error = false;
            int argsLen = args.Length;

            try
            {
                for (int i = 0; i < argsLen; i++)
                {
                    if (error) break;
                    if (args[i].StartsWith("-") || args[i].StartsWith("/"))
                        args[i] = "*" + args[i].Substring(1).ToLower();

                    switch (args[i])
                    {
                        case "*projname":
                        case "*n":
                            if (++i >= argsLen) return false;
                            projName = args[i];
                            break;
                        //case "*timeout":
                        //case "*t":
                        //    if (++i >= argsLen) return false;
                        //    timeoutSeconds = Convert.ToInt32(args[i]);
                        //    break;
                        case "*?":
                        default:
                            error = true;
                            break;
                    }
                }
            }
            catch (FormatException)
            {
                error = true;
            }

            if (string.IsNullOrEmpty(projName)) error = true;
            return !error;
        }

        private static void Usage()
        {
            string example = "Usage: -projName | -p \"Project name\"";
            example += "\nExample: -p \"My New Project\"";
            Console.WriteLine(example);
        }

        private static void ExitApp(string reason)
        {
            if (reason != string.Empty) Console.WriteLine(reason);
            Console.Write("\nPress any key to exit... ");
            Console.ReadKey(true);
            Environment.Exit(0);
        }
    }
}

For example, a project named TestProject9 has a Project Departments custom field value, a multivalue text custom field with three lookup table entry values, a simple text custom field, and a date custom field. Because Project Departments is a built-in custom field, the GUID for the Project Departments custom field in default Project Web App instances is 9d77d62a-a92e-4d40-adc8-446c90eb7456. Following is the output of the GetProjectFieldValues sample app:

        Draft project ID        :       Project name

b846e947-29e0-43eb-b5c6-5ddeaf08d5c0 :  CSOM Project9

    Custom field: 'Project Departments'; FieldType = TEXT;
        InternalName = Custom_9d77d62aa92e4d40adc8446c90eb7456
        Lookup table: Department
            Entry(0): String value = Test Dept 1;
                  InternalName = Entry_bbc07ff5b06de21193f40021704e28a0

    Custom field: 'ProjectMVText'; FieldType = TEXT;
        InternalName = Custom_9295a8759d91e21193f90021704e28a0
        Lookup table: TestTextMV
            Entry(0): String value = First.001;
                  InternalName = Entry_4a2750309d91e21193f90021704e28a0
            Entry(1): String value = Second.002;
                  InternalName = Entry_4d2750309d91e21193f90021704e28a0
            Entry(2): String value = Third;
                  InternalName = Entry_4f2750309d91e21193f90021704e28a0

    Custom field: 'Test Project Date'; FieldType = DATE;
        InternalName = Custom_37f61601a991e21193f90021704e28a0
        Date value = 3/29/2013 8:00:00 AM

    Custom field: 'Test project simple text'; FieldType = TEXT;
        InternalName = Custom_8bf7eed5cc94e21193f90021704e28a0
        Single-line string value = This is a line of text

Press any key to exit...

See also

Reference

DraftProject class

DraftProject members

Microsoft.ProjectServer.Client namespace