private void PopulateChildrenIDs(ProfileQuestion question, ProfileQuestion[] questions, Dictionary<int, object> dicQuestions, List<string> childClientIDs) { ProfileQuestion[] childQuestions = questions.Where(q => q.ParentQuestionID.HasValue && q.ParentQuestionID.Value == question.Id).ToArray(); if (childQuestions.Length > 0) { foreach (ProfileQuestion childQuestion in childQuestions) { // child question is not visible so skip it if (dicQuestions.ContainsKey(childQuestion.Id)) { string childClientID = ((IProfileSearchComponent)dicQuestions[childQuestion.Id]).UserControlPanel.ClientID; childClientIDs.Add(childClientID); } PopulateChildrenIDs(childQuestion, questions, dicQuestions, childClientIDs); } } }
private void SetCascadeQuestions(ProfileQuestion[] questions, Dictionary<int, object> dicQuestions) { List<int> lHiddenParentQuestions = new List<int>(); foreach (ProfileQuestion question in questions) { ProfileQuestion[] childQuestions = questions.Where(q => q.ParentQuestionID.HasValue && q.ParentQuestionID.Value == question.Id).ToArray(); bool isParent = childQuestions.Length > 0; bool isChild = question.ParentQuestionID.HasValue; if (!dicQuestions.ContainsKey(question.Id)) // if current question is hidden continue; Control currentQuestionControl = (Control)dicQuestions[question.Id]; if ((currentQuestionControl as ICascadeQuestionComponent) != null) ((ICascadeQuestionComponent)currentQuestionControl).GenerateResetValuesJS(); if (isParent) { Dictionary<string, object[]> childClientIDsWithParentQuestionChoices = new Dictionary<string, object[]>(); GetChildrenClientIDs(question, questions, dicQuestions, childClientIDsWithParentQuestionChoices); if ((currentQuestionControl as ICascadeQuestionComponent) != null) ((ICascadeQuestionComponent)currentQuestionControl).GenerateJSForChildVisibility(childClientIDsWithParentQuestionChoices); else new Exception(String.Format("{0} control must implement ICascadeQuestionComponent", currentQuestionControl.ID)); } if (isChild) { // if parent question is hidden hide the child if (!dicQuestions.ContainsKey(question.ParentQuestionID.Value) || lHiddenParentQuestions.Contains(question.ParentQuestionID.Value)) { lHiddenParentQuestions.Add(question.Id); ((IProfileSearchComponent)currentQuestionControl).UserControlPanel.Attributes.Add("style", "display:none"); ((IProfileSearchComponent)currentQuestionControl).ClearAnswers(); continue; } Control currentQuestionParentControl = (Control)dicQuestions[question.ParentQuestionID.Value]; List<string> parentAnswers = new List<string>(); foreach (ProfileAnswer answer in ((IProfileSearchComponent)currentQuestionParentControl).Answers) { parentAnswers.Add(answer.Value); } if (!question.ParentQuestionChoices.Split(':').Any(parentChoice => parentAnswers.Contains(parentChoice))) { lHiddenParentQuestions.Add(question.Id); ((IProfileSearchComponent)currentQuestionControl).UserControlPanel.Attributes.Add("style", "display:none"); ((IProfileSearchComponent)currentQuestionControl).ClearAnswers(); } } } }
private void GetChildrenClientIDs(ProfileQuestion question, ProfileQuestion[] questions, Dictionary<int, object> dicQuestions, Dictionary<string, object[]> childClientIDsWithParentQuestionChoices) { ProfileQuestion[] childQuestions = questions.Where(q => q.ParentQuestionID.HasValue && q.ParentQuestionID.Value == question.Id).ToArray(); if (childQuestions.Length > 0) { foreach (ProfileQuestion childQuestion in childQuestions) { var childClientIDs = new List<string>(); // child question is not visible so skip it if (dicQuestions.ContainsKey(childQuestion.Id)) { string childClientID = ((IProfileSearchComponent)dicQuestions[childQuestion.Id]).UserControlPanel.ClientID; string[] parentQuestionChoices = childQuestion.ParentQuestionChoices.Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries); childClientIDsWithParentQuestionChoices.Add(childClientID, new object[] { parentQuestionChoices, childClientIDs }); } PopulateChildrenIDs(childQuestion, questions, dicQuestions, childClientIDs); } } }
private bool SetCascadeQuestions(ProfileQuestion[] questions, Dictionary<int, object> dicQuestions) { bool hasCascadeQuestions = false; List<int> lHiddenParentQuestions = new List<int>(); foreach (ProfileQuestion question in questions) { ProfileQuestion[] childQuestions = questions.Where(q => q.ParentQuestionID.HasValue && q.ParentQuestionID.Value == question.Id).ToArray(); bool isParent = childQuestions.Length > 0; bool isChild = question.ParentQuestionID.HasValue; if (!dicQuestions.ContainsKey(question.Id)) continue; // if current question is hidden Control currentQuestionControl = (Control)dicQuestions[question.Id]; if ((currentQuestionControl as ICascadeQuestionComponent) != null) ((ICascadeQuestionComponent)currentQuestionControl).GenerateResetValuesJS(); if (isParent) { hasCascadeQuestions = true; Dictionary<string, object[]> childClientIDsWithParentQuestionChoices = new Dictionary<string, object[]>(); GetChildrenClientIDs(question, questions, dicQuestions, childClientIDsWithParentQuestionChoices); if ((currentQuestionControl as ICascadeQuestionComponent) != null) ((ICascadeQuestionComponent)currentQuestionControl).GenerateJSForChildVisibility(childClientIDsWithParentQuestionChoices); else new Exception(String.Format("{0} control must implement ICascadeQuestionComponent", currentQuestionControl.ID)); } if (isChild) { // if parent question is hidden hide the child if (!dicQuestions.ContainsKey(question.ParentQuestionID.Value) || lHiddenParentQuestions.Contains(question.ParentQuestionID.Value)) { lHiddenParentQuestions.Add(question.Id); ((IProfileQuestionComponent)currentQuestionControl).UserControlPanel.Attributes.Add("style", "display:none"); ((IProfileQuestionComponent) currentQuestionControl).Answer.Value = String.Empty; continue; } Control currentQuestionParentControl = (Control)dicQuestions[question.ParentQuestionID.Value]; string[] parentAnswers = new string[0]; try { parentAnswers = ((IProfileQuestionComponent)currentQuestionParentControl).Answer.Value.Split( new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); } catch (AnswerRequiredException) { } if (!question.ParentQuestionChoices.Split(':').Any(parentChoice => parentAnswers.Contains(parentChoice))) { lHiddenParentQuestions.Add(question.Id); ((IProfileQuestionComponent) currentQuestionControl).UserControlPanel.Attributes.Add("style", "display:none"); ((IProfileQuestionComponent)currentQuestionControl).Answer.Value = String.Empty; } } } return hasCascadeQuestions; }