diff --git a/FetchXmlBuilder/Forms/SelectAttributesDialog.Designer.cs b/FetchXmlBuilder/Forms/SelectAttributesDialog.Designer.cs index e033aa0e..61b5893d 100644 --- a/FetchXmlBuilder/Forms/SelectAttributesDialog.Designer.cs +++ b/FetchXmlBuilder/Forms/SelectAttributesDialog.Designer.cs @@ -369,13 +369,13 @@ private void InitializeComponent() // lnkShowOnForms // this.lnkShowOnForms.AutoSize = true; - this.lnkShowOnForms.Enabled = false; this.lnkShowOnForms.Location = new System.Drawing.Point(180, 19); this.lnkShowOnForms.Name = "lnkShowOnForms"; this.lnkShowOnForms.Size = new System.Drawing.Size(52, 13); this.lnkShowOnForms.TabIndex = 3; this.lnkShowOnForms.TabStop = true; this.lnkShowOnForms.Text = "On Forms"; + this.lnkShowOnForms.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkShowOnForms_LinkClicked); // // SelectAttributesDialog // diff --git a/FetchXmlBuilder/Forms/SelectAttributesDialog.cs b/FetchXmlBuilder/Forms/SelectAttributesDialog.cs index 85419efa..c98f0158 100644 --- a/FetchXmlBuilder/Forms/SelectAttributesDialog.cs +++ b/FetchXmlBuilder/Forms/SelectAttributesDialog.cs @@ -17,6 +17,7 @@ public partial class SelectAttributesDialog : Form private int sortcolumn = 0; private List allItems; private List viewcolumns; + private List formcolumns; private FetchXmlBuilder fxb; private string entity; private bool initiating = true; @@ -59,7 +60,7 @@ private void GenerateAllItems(List attributes, List s } } - private void PopulateAttributes(bool required = false, bool isonanyview = false) + private void PopulateAttributes(bool required = false, bool isonanyview = false, bool isonanyform = false) { initiating = true; lvAttributes.Items.Clear(); @@ -76,6 +77,10 @@ private void PopulateAttributes(bool required = false, bool isonanyview = false) { continue; } + if (isonanyform && !IsOnAnyForm(item.Tag as AttributeMetadata)) + { + continue; + } lvAttributes.Items.Add(item); } } @@ -136,6 +141,52 @@ private bool IsOnAnyView(AttributeMetadata meta) return viewcolumns.Contains(meta.LogicalName); } + private bool IsOnAnyForm(AttributeMetadata meta) + { + if (formcolumns == null) + { + if (working) + { + return false; + } + working = true; + Enabled = false; + fxb.WorkAsync(new WorkAsyncInfo + { + Message = "Loading forms...", + Work = (w, a) => + { + if (fxb.Service == null) + { + throw new Exception("Need a connection to load forms."); + } + var query = new QueryExpression("systemform"); + query.ColumnSet.AddColumns("name", "type", "formxml"); + query.Criteria.AddCondition("objecttypecode", ConditionOperator.Equal, entity); + query.Criteria.AddCondition("formactivationstate", ConditionOperator.Equal, 1); + query.Criteria.AddCondition("formxml", ConditionOperator.NotNull); + a.Result = fxb.RetrieveMultiple(query); + }, + PostWorkCallBack = (a) => + { + if (a.Error != null) + { + fxb.ShowErrorDialog(a.Error); + } + else if (a.Result is EntityCollection forms) + { + SetFormColumns(forms); + PopulateAttributes(isonanyform: true); + } + Enabled = true; + working = false; + } + }); + return false; + } + return formcolumns.Contains(meta.LogicalName); + } + private void SetViewColumns(EntityCollection views) { viewcolumns = new List(); @@ -156,6 +207,37 @@ private void SetViewColumns(EntityCollection views) viewcolumns = viewcolumns.Distinct().ToList(); } + private void SetFormColumns(EntityCollection forms) + { + formcolumns = new List(); + foreach (var form in forms.Entities) + { + var formxml = form.GetAttributeValue("formxml"); + var formdoc = new XmlDocument(); + formdoc.LoadXml(formxml); + var nodes = formdoc.ChildNodes; + foreach (XmlNode node in nodes) + { + formcolumns.AddRange(FindCellControlFields(node)); + } + } + formcolumns = formcolumns.Distinct().ToList(); + } + + private IEnumerable FindCellControlFields(XmlNode node) + { + var result = new List(); + if (node.Name == "cell" && + node.SelectSingleNode("control") is XmlNode control && + control.AttributeValue("datafieldname") is string field && + !string.IsNullOrEmpty(field)) + { + result.Add(field); + } + node.ChildNodes.Cast().ToList().ForEach(n => result.AddRange(FindCellControlFields(n))); + return result; + } + public List GetSelectedAttributes() { var result = new List(); @@ -254,12 +336,17 @@ private void lnkShowAll_LinkClicked(object sender, LinkLabelLinkClickedEventArgs private void lnkShowRequired_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - PopulateAttributes(true); + PopulateAttributes(required: true); } private void lnkShowOnViews_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - PopulateAttributes(false, true); + PopulateAttributes(isonanyview: true); + } + + private void lnkShowOnForms_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + PopulateAttributes(isonanyform: true); } private void lnkCheckShown_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)