private void lvEntities_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvEntities.SelectedItems.Count > 0)
            {
                string entityLogicalName = lvEntities.SelectedItems[0].Tag.ToString();

                Cursor = Cursors.WaitCursor;
                lvFormXmls.Items.Clear();

                WorkAsync(new WorkAsyncInfo
                {
                    Message       = "Loading formXmls...",
                    AsyncArgument = entityLogicalName,
                    Work          = (bw, evt) =>
                    {
                        evt.Result = FormXmlHelper.GetFormXmlsByEntity(evt.Argument.ToString(), Service);
                    },
                    PostWorkCallBack = evt =>
                    {
                        if (evt.Error != null)
                        {
                            MessageBox.Show(this, "An error occured: " + evt.Error.Message, "Error",
                                            MessageBoxButtons.OK,
                                            MessageBoxIcon.Error);
                        }
                        else
                        {
                            Cursor       = Cursors.Default;
                            var formXmls = (EntityCollection)evt.Result;
                            // lvFormXmls.Items.AddRange(formXmls.Entities.Select(
                            //         c => new ListViewItem(,c.GetAttributeValue<string>("userqueryvisualizationid")) { Tag = c }).ToArray());
                            foreach (var entity in formXmls.Entities)
                            {
                                bool isUser = true;
                                if (entity.Attributes.Contains("formid"))
                                {
                                    isUser = false;
                                }

                                ListViewItem lvi = new ListViewItem( );
                                lvi.Tag          = entity;
                                lvi.SubItems.Add(entity.GetAttributeValue <string>("name"));
                                lvi.SubItems.Add(isUser.ToString());
                                lvi.SubItems.Add(entity.GetAttributeValue <bool>("isdefault").ToString());
                                lvi.SubItems.Add(entity.GetAttributeValue <bool>("isdesktopenabled").ToString());
                                lvi.SubItems.Add(entity.GetAttributeValue <bool>("istabletenabled").ToString());
                                lvi.SubItems.Add(entity.GetAttributeValue <string>("description"));
                                lvFormXmls.Items.Add(lvi);
                            }
                        }
                    }
                });
            }
        }
        public void ProcessFiles(List <string> files)
        {
            WorkAsync(new WorkAsyncInfo
            {
                Message          = "Analyzing file(s)...",
                AsyncArgument    = files,
                Work             = (bw, e) => { e.Result = FormXmlHelper.AnalyzeFiles((List <string>)e.Argument, Service); },
                PostWorkCallBack = evt =>
                {
                    var results = (List <FormXmlDefinition>)evt.Result;
                    if (results.Any(r => r.Errors.Count > 0))
                    {
                        // Display errors
                        var elForm = new ErrorsListForm(results);
                        elForm.ShowDialog(ParentForm);
                    }
                    else
                    {
                        if (results.Any(r => r.Exists))
                        {
                            // Display overwrite confirmation
                            var ocDialog = new OverwriteConfirmationDialog(results);
                            var result   = ocDialog.ShowDialog(ParentForm);
                            if (result == DialogResult.Cancel)
                            {
                                return;
                            }
                        }

                        WorkAsync(new WorkAsyncInfo("Importing file(s)...", (w, evt2) =>
                        {
                            FormXmlHelper.ImportFiles((List <FormXmlDefinition>)evt2.Argument, Service);

                            w.ReportProgress(0, "Publishing entities...");

                            Service.Execute(new PublishXmlRequest
                            {
                                ParameterXml = string.Format("<importexportxml><entities>{0}</entities><nodes/><securityroles/><settings/><workflows/></importexportxml>", string.Join("", results.Select(r => string.Format("<entity>{0}</entity>", r.Entity.GetAttributeValue <string>("primaryentitytypecode")))))
                            });
                        })
                        {
                            AsyncArgument    = results,
                            PostWorkCallBack = evt2 =>
                            {
                                if (evt2.Error != null)
                                {
                                    MessageBox.Show(ParentForm, evt2.Error.Message, "Error",
                                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                else
                                {
                                    MessageBox.Show(ParentForm, "FormXml(s) imported!", "Information",
                                                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    lvEntities_SelectedIndexChanged(null, null);
                                }
                            },
                            ProgressChanged = evt2 =>
                            {
                                SetWorkingMessage(evt2.UserState.ToString());
                            }
                        });
                    }
                }
            });
        }