Wednesday, 9 October 2019

CSOM: How to compare fields of two SharePoint lists?

using F = System.Windows.Forms;
using Microsoft.SharePoint.Client;
using PnP = OfficeDevPnP.Core;

private void btnCompare_Click(object sender, EventArgs e)
        {
            try
            {
                //Get source fields
                PnP.AuthenticationManager authManagerSource = new PnP.AuthenticationManager();
                ClientContext clientContextSource = authManagerSource.GetWebLoginClientContext(txtSourceList.Text);

                List sourceList = clientContextSource.Web.Lists.GetByTitle(drpSourceLists.SelectedItem.ToString());
                // fetch the fields from this list
                FieldCollection sourceFields = sourceList.Fields;
                clientContextSource.Load(sourceFields);
                clientContextSource.ExecuteQuery();

                var sourceColumns = new List<KeyValuePair<string, string>>();
                sourceColumns.Add(new KeyValuePair<string, string>("ID", "ID"));

                foreach (var f in sourceFields)
                {
                    if (f.InternalName.StartsWith("_") || f.InternalName.StartsWith("ows"))
                    {
                        continue;  // note: this will also skip the user created fields
                    }
                        sourceColumns.Add(new KeyValuePair<string, string>(f.InternalName, f.Title + "|" + f.FieldTypeKind));
                   
                }

                //Get target fields
                PnP.AuthenticationManager authManagerTarget = new PnP.AuthenticationManager();
                ClientContext clientContextTarget = authManagerTarget.GetWebLoginClientContext(txtTargetList.Text);

                List TargetList = clientContextTarget.Web.Lists.GetByTitle(drpTargetLists.SelectedItem.ToString());
                // fetch the fields from this list
                FieldCollection targetFields = TargetList.Fields;
                clientContextTarget.Load(targetFields);
                clientContextTarget.ExecuteQuery();

                var targetColumns = new List<string> { "ID" };
                foreach (var f in targetFields)
                {
                    if (f.InternalName.StartsWith("_") || f.InternalName.StartsWith("ows"))
                    {
                       continue; // note: this will also skip the user created fields
                    }
targetColumns.Add(f.InternalName);
                }

                //Compare and remove same fields
                foreach (var col in targetColumns)
                {
                    try
                    {
                        sourceColumns.Remove(sourceColumns.First(item => item.Key.Equals(col)));
                    }
                    catch { }
                }

                DataTable dt = new DataTable();
                dt.Columns.Add("Missing Fields");
                dt.Columns.Add("Internal Name");
                dt.Columns.Add("Type");
                dt.Columns.Add("Create Missing Fields using below Name");
                DataRow dr;

                foreach (var col in sourceColumns)
                {
                    dr = dt.NewRow();
                    dr["Missing Fields"] = col.Value.ToString().Split('|')[0];
                    dr["Internal Name"] = col.Key;
                    dr["Type"] = col.Value.ToString().Split('|')[1];
                    dr["Create Missing Fields using below Name"] = System.Xml.XmlConvert.DecodeName(col.Key);
                    dt.Rows.Add(dr);
                }
                dataGridViewMissingFields.DataSource = null;
                dataGridViewMissingFields.DataSource = dt;
                dataGridViewMissingFields.Columns[0].Width = 150;
                dataGridViewMissingFields.Columns[1].Width = 150;
                dataGridViewMissingFields.Columns[2].Width = 80;
                dataGridViewMissingFields.Columns[3].Width = 240;
            }
            catch(Exception ex)
            {
                F.MessageBox.Show("Error: " + ex.Message);
            }
        }

No comments:

Post a Comment