Thursday, 10 October 2019

CSOM: How to copy all items from one SharePoint list to another?

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

PnP.AuthenticationManager authManagerTarget = new PnP.AuthenticationManager();
                using (ClientContext clientContextTarget = authManagerTarget.GetWebLoginClientContext(txtTargetSite.Text))
                {
                    List targetList = clientContextTarget.Web.Lists.GetByTitle(drpTargetList.SelectedItem.ToString());
                    clientContextTarget.Load(targetList);
                    clientContextTarget.ExecuteQuery();

                    PnP.AuthenticationManager authManagerSource = new PnP.AuthenticationManager();
                    using (ClientContext clientContextSource = authManagerSource.GetWebLoginClientContext(txtSourceSite.Text))
                    {
                        List sourceList = clientContextSource.Web.Lists.GetByTitle(drpSourceList.SelectedItem.ToString());
                        ListItemCollection sourceItems = sourceList.GetItems(CamlQuery.CreateAllItemsQuery());
                        clientContextSource.Load(sourceItems);
                        clientContextSource.ExecuteQuery();

                        progressBar1.Maximum = sourceItems.Count;

                        foreach (ListItem sourceItem in sourceItems)
                        {
                            ListItemCreationInformation newItem = new ListItemCreationInformation();
                            ListItem targetItem = targetList.AddItem(newItem);
                            FieldCollection sourceFields = sourceList.Fields;
                            clientContextSource.Load(sourceFields);
                            clientContextSource.ExecuteQuery();
                            foreach (Field field in sourceFields)
                            {
                                if (field.InternalName != "Attachments" && field.InternalName != "ContentType" &&
                                     !field.Hidden && !field.ReadOnlyField &&
                                     sourceItem[field.InternalName] != null &&
field.FieldTypeKind.ToString() != "URL" && field.FieldTypeKind.ToString() != "WorkflowStatus")
                                {
                                    try
                                    {
                                        targetItem[field.InternalName] = sourceItem[field.InternalName];
                                    }
                                    catch (Exception ex)
                                    {
                                        this.LogError(ex);
                                    }
                                }
                            }
                            targetItem.Update();
                            clientContextTarget.ExecuteQueryRetryAsync(10, 10000);
                            progressBar1.Value += 1;
                        }
                    }
                }

CSOM: How to delete all items in a SharePoint list?

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

try
            {
                PnP.AuthenticationManager authManager = new PnP.AuthenticationManager();
                using (ClientContext clientContext = authManager.GetWebLoginClientContext(txtSourceUrl.Text))
                {
                    List list = clientContext.Web.Lists.GetByTitle(drpLists.SelectedItem.ToString());
                    CamlQuery camlQuery = new CamlQuery();
                    camlQuery.ViewXml = "<View><Query><Where><Neq><FieldRef Name='ID' /><Value Type='Counter'>0</Value></Neq></Where></Query></View>";
                    ListItemCollection allItems = list.GetItems(camlQuery);
                    clientContext.Load(allItems);
                    clientContext.ExecuteQuery();
                    int itemCount = allItems.Count;
                    F.MessageBox.Show("Deletion is started. Please monitor the count on SharePoint.");
                    if (itemCount > 0)
                    {
                        for (int i = itemCount - 1; i > -1; i--)
                        {
                            allItems[i].DeleteObject();
                            clientContext.ExecuteQuery();
                        }
                    }
                    F.MessageBox.Show("Items are deleted.");
                }
            }
            catch (Exception ex)
            {
                F.MessageBox.Show("Error: " + ex.Message);
            }
        }

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);
            }
        }

How to decode SharePoint list field internal name?


System.Xml.XmlConvert.DecodeName("internal_name_of_field");