Share via


DraftProject.FieldValues 屬性

取得草稿專案自訂欄位值。

命名空間:  Microsoft.ProjectServer.Client
組件:  Microsoft.ProjectServer.Client (在 Microsoft.ProjectServer.Client.dll 中)

語法

'宣告
Public ReadOnly Property FieldValues As Dictionary(Of String, Object)
    Get
'用途
Dim instance As DraftProject
Dim value As Dictionary(Of String, Object)

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

屬性值

類型:System.Collections.Generic.Dictionary<String, Object>
一組的成對的自訂欄位值,其中索引鍵是內部的自訂欄位的名稱,而值為自訂欄位值或查閱表格項的內部名稱機碼和值。

範例

下列程式碼範例會取出指定的企業專案,並再查詢的自訂欄位其集合的草稿專案。程式碼範例會列出 GUID 以及專案、 名稱和每個欄位的值的名稱與每個專案中的自訂欄位的內部名稱作為機碼值配對中的索引鍵。如果自訂欄位使用查閱表格, FieldValues項目包含內部查閱表格項目的名稱。如果自訂欄位是多重值文字欄位,範例會列出每個查閱表格項目的專案中的自訂欄位的內部名稱與值。如果自訂欄位不使用查閱表格,此值為只是自訂欄位值。

自訂欄位的內部名稱為字串值"Custom_ [GUID] 」,例如Custom_9d77d62aa92e4d40adc8446c90eb7456。查閱表格項的內部名稱為字串值"Entry_ [GUID] 」,例如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);
        }
    }
}

例如,名為 TestProject9 的專案擁有專案部門自訂欄位值、 三個查閱表格項目值、 單純的文字自訂欄位,與日期自訂欄位的多值文字自訂欄位。由於專案部門內建的自訂欄位,專案部門自訂欄位的 GUID 以預設Project Web App執行個體是9d77d62a-a92e-4d40-adc8-446c90eb7456。以下是GetProjectFieldValues範例應用程式的輸出:

        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...

請參閱

參照

DraftProject 類別

DraftProject 成員

Microsoft.ProjectServer.Client 命名空間