using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Xrm.Sdk; namespace XrmTools { public partial class MainWindow : Form { public static string[] entityNames; public static void Main(string[] args) { new MainWindow().ShowDialog(); } public MainWindow() { InitializeComponent(); btnBrowse.Enabled = false; btnSearch.Enabled = false; btnDelete.Enabled = false; backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_LoadEntityNames); backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_LoadedEntityNames); backgroundWorker.RunWorkerAsync(); } private void backgroundWorker_LoadEntityNames(object sender, DoWorkEventArgs e) { entityNames = EntityUtility.ReadEntityNames(); } private void backgroundWorker_LoadedEntityNames(object sender, RunWorkerCompletedEventArgs e) { btnBrowse.Enabled = true; btnSearch.Enabled = true; } private void btnSearch_Click(object sender, EventArgs e) { backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted); string logicalName = txtLogicalName.Text; string guid = txtGuid.Text; if (!string.IsNullOrEmpty(logicalName) && !string.IsNullOrEmpty(guid)) { Entity referenceEntity = EntityUtility.ReadEntity(logicalName, new Guid(guid)); if (referenceEntity != null) { btnSearch.Enabled = false; toolStripProgressBar.Visible = true; backgroundWorker.RunWorkerAsync(referenceEntity); } else { MessageBox.Show("Unable to find specified entity", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { btnSearch.Enabled = true; toolStripProgressBar.Visible = false; } void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { toolStripProgressBar.Value = e.ProgressPercentage; } void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { XrmTools.References = new List(); Entity referenceEntity = (Entity)e.Argument; if (referenceEntity != null) { string[] entities = XrmTools.EntityNames; for (int i = 0; i < entities.Length; i++) { EntityCollection collection = EntityUtility.ReadEntities(entities[i]); Debug.WriteLine(string.Format("{0}/{1}: {2} {3}", i, entities.Length, entities[i], XrmTools.CheckReference(referenceEntity.Id, collection) ? "*KO*" : "OK")); backgroundWorker.ReportProgress((100 * i / entities.Length)); } //List references = XrmTools.CheckReference(referenceEntity); grdReferences.AutoGenerateColumns = true; SetDataSource(grdReferences, XrmTools.References); } } private delegate void SetDataSourceDelegate(Control control, List list); private void SetDataSource(Control control, List list) { if (this.InvokeRequired) { this.Invoke(new SetDataSourceDelegate(SetDataSource), new object[] { grdReferences, list }); return; } grdReferences.DataSource = list; } private void grdReferences_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { XrmUtils.Delete((string)e.Row.Cells["Name"].Value, (Guid)e.Row.Cells["Id"].Value); } private void btnBrowse_Click(object sender, EventArgs e) { EntityBrowser dialog = new EntityBrowser(entityNames); if (dialog.ShowDialog(this) == DialogResult.OK) { txtLogicalName.Text = dialog.EntityName; } } private void btnDelete_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in grdReferences.SelectedRows) { grdReferences.Rows.Remove(row); } } private void btnBrowseEntity_Click(object sender, EventArgs e) { EntityCollection collection = EntityUtility.ReadEntities(txtLogicalName.Text); string[] values = (from entity in collection.Entities select string.Format("{0} {1} - {{{2}}}", entity.Attributes["firstname"], entity.Attributes["lastname"], entity.Id)).ToArray(); EntityBrowser dialog = new EntityBrowser(values); if (dialog.ShowDialog(this) == DialogResult.OK) { txtGuid.Text = dialog.EntityName; } } private void txtLogicalName_TextChanged(object sender, EventArgs e) { btnBrowseEntity.Enabled = !string.IsNullOrEmpty(txtLogicalName.Text); } } }