private static List<DynamicColumnsCollection> MakeColumnsList(RegistrationFormAdminDetailView parent, List<DynamicColumnsCollection> columns, List<SubEntityRecord> recordList, DynamicFormDto form)
        {
            int eventRegistrationEntityId = GetEventRegistrationFormEntityId(parent);

            var columnCollection = new DynamicColumnsCollection();
            int i = 0;

            foreach (var record in recordList)
            {
                //if dynamicColumnInstance Id = 0 then it's new, so save it.
                var dynamicColumnInstanceId = int.Parse(CommonUtils.GetFieldValue(record.Fields, _id));

                if (dynamicColumnInstanceId == 0)
                    dynamicColumnInstanceId = AddDynamicColumnInstant(parent, eventRegistrationEntityId, record);
                else
                    UpdateDynamicColumnInstant(parent, eventRegistrationEntityId, record, dynamicColumnInstanceId);

                var column = new DynamicFormsDynamicColumnDto
                {
                    DynamicForm = form,
                    FormOrder = i++,
                    DynamicColumnInstance = new DynamicColumnInstanceDto
                    {
                        Id = dynamicColumnInstanceId
                    }
                };

                columnCollection.Add(column);
            }

            columns.Add(columnCollection);

            return columns;
        }
        private List<Field> BuildFields(DynamicFormDto form, bool newRecord)
        {
            var fields = new List<Field>();

            if (!newRecord)
                fields.Add(new Field(_id, "Id", FieldTypes.Label, form.Id));
            else
                fields.Add(new Field(_id, "Id", FieldTypes.Hidden, 0));

            fields.Add(new Field(_templateName, "Template Name", FieldTypes.Text, form.Name, true));

            return fields;
        }
        public static int Save(RegistrationFormAdminDetailView parent, List<SubEntity> subEntities, string templateName)
        {
            try
            {
                if (string.IsNullOrEmpty(templateName.Trim()))
                    throw new Exception("Template Name required.");

                var columns = new List<DynamicColumnsCollection>();

                var form = new DynamicFormDto
                {
                    Name = templateName,
                    IsTemplate = true,
                    Id = _templateId,
                    LabelPosition = string.Empty
                };

                var fieldList = new List<object>();

                ValidateSubEntitites(subEntities);

                //build columns from both left and right subentities
                foreach (var sub in subEntities)
                {
                    var records = sub.Records.Where(a => a.Action != RecordActions.Deleted).ToList();
                    columns = MakeColumnsList(parent, columns, records, form);

                    //get fieldNames from both left and right columns, and then check for duplicates.
                    var subEntityFields = records.Where(r => r.Fields != null).Select(f => f.Fields);
                    foreach (var item in subEntityFields.ToList())
                    {
                        var fieldName = item.Where(r => r.FieldName == _fieldName).Select(r => r.FieldValue).First();
                        fieldList.Add(fieldName);
                    }
                }

                var duplicates = fieldList.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
                if (duplicates.Count() > 0)
                {
                    var errorMessage = string.Format("The following fields appear in the template more than once, please remove the field from either the Left or Right Column: {0}", string.Join(", ", duplicates));
                    throw new Exception(errorMessage);
                }

                if (_templateId > 0)
                {
                    var request = new UpdateDynamicFormWithColumnsRequest { Form = form, FieldsInColumns = columns };
                    parent.ProcessRequest<UpdateDynamicFormWithColumnsResponse>(request);
                }
                else
                {
                    var request = new AddDynamicFormWithColumnsRequest { Form = form, FieldsInColumns = columns };
                    _templateId = parent.ProcessRequest<AddDynamicFormWithColumnsResponse>(request).Id;
                }

                return _templateId;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        private List<SubEntity> BuildSubEntities(DynamicFormDto form)
        {
            var subEntities = new List<SubEntity>();

            subEntities.Add(RegistrationFormColumnAdminDetailView.BuildSubEntity(this, form.Id, _registrationFormLeftColumn));
            subEntities.Add(RegistrationFormColumnAdminDetailView.BuildSubEntity(this, form.Id, _registrationFormRightColumn));

            _viewModel.SubEntities.Clear();

            return subEntities;
        }