Hi,
This view basically displays Questions, Question Choices and selects or displays the answer as well. The Question Choices can be a Yes/No, MultipleSelect, MultipleChoice or FreeText. The view has a RadGridView on line 260 and this grid has RowDetailsTemplate which displays question number and question text in a RadGridView . This RadGridView has has RowDetailsTemplateSelector which displays the Question Choices which is either Yes/NO or Multiple Choice or Free Text etc based on the Question Type. This in turn calls the DataTemplates. Basically with this complex nested GridViews and Templates and the ModelView methods, the view takes at least 3 minutes to load 30 questions.
How can I improve the performance of this View?
Your guidance is appreciated.
View:
<UserControl.Resources> <DataTemplate x:Key="SurveyQuestionMultipleChoiceDataTemplate"> <StackPanel Grid.Column="1" Orientation="Vertical" Width="Auto" HorizontalAlignment="Left" Margin="35,0,0,0" > <RadioButton HorizontalAlignment="Left" VerticalAlignment="Center" Content="{Binding SurveyChoiceText}" IsChecked="{Binding IsChecked}" FontSize="13" GroupName="SurveyQuestionRadioGroup" /> </StackPanel> </DataTemplate> <DataTemplate x:Key="SurveyQuestionMultipleSelectDataTemplate"> <StackPanel Grid.Column="1" Orientation="Vertical" Width="Auto" HorizontalAlignment="Left" Margin="30,5,0,0" > <CheckBox HorizontalAlignment="Left" HorizontalContentAlignment="Center" Content="{Binding SurveyChoiceText}" IsChecked="{Binding IsChecked}" FontSize="13" telerik:StyleManager.Theme="Office_Black" /> </StackPanel> </DataTemplate> <DataTemplate x:Key="SurveyQuestionsRankingDataTemplate"> <StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Left" Margin="23,0,0,0" Width="Auto"> <ComboBox Name="cbxRank" DisplayMemberPath="RankNumberID" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,10,0,0" ItemsSource="{Binding Rank}" > </ComboBox> <TextBlock Text="{Binding SurveyChoiceText}" TextWrapping="Wrap" Width="Auto" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="13" /> </StackPanel> </DataTemplate> </ResourceDictionary></UserControl.Resources><Grid> <Border Margin="20"> <Grid Width="Auto"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.Resources> <telerik:NullToVisibilityConverter x:Key="NullToVisibilityConverter" /> <DataTemplate x:Key="YesNoTemplate" > <StackPanel Orientation="Vertical" > <StackPanel Orientation="Horizontal" Margin="30,10,10,15" Width="Auto"> <RadioButton IsChecked="{Binding SrvyAnswer.IsYesChecked}" Content="Yes" VerticalAlignment="Center" GroupName="YesNo" /> <RadioButton IsChecked="{Binding SrvyAnswer.IsNoChecked}" Content="No" VerticalAlignment="Center" GroupName="YesNo" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="30,0,0,5"> <TextBlock Text="{Binding SrvyAnswer.Comments}" IsEnabled="False" Height="Auto" Width="1400" TextWrapping="Wrap" FontSize="13" Margin="5,10,10,15" /> </StackPanel> </StackPanel> </DataTemplate> <DataTemplate x:Key="MultipleChoiceTemplate"> <telerik:RadListBox ItemsSource="{Binding SurveyQuestionAnswers}" VerticalAlignment="Top" ItemTemplate="{StaticResource SurveyQuestionMultipleChoiceDataTemplate}" /> </DataTemplate> <DataTemplate x:Key="MultipleSelectTemplate"> <StackPanel Orientation="Vertical"> <telerik:RadListBox ItemsSource="{Binding SurveyQuestionAnswers}" VerticalAlignment="Top" BorderThickness="0" Margin="0,0,10,10" ItemTemplate="{StaticResource SurveyQuestionMultipleSelectDataTemplate}" /> <StackPanel Orientation="Horizontal" Visibility="{Binding SurveyAnswersCommentForMultipleSelect, Converter={StaticResource NullToVisibilityConverter} }"> <TextBlock Name="txtTotalResponses" Text="{Binding SurveyAnswersCommentForMultipleSelect}" Width="1200" TextWrapping="Wrap" Grid.Column="1" FontWeight="Regular" FontSize="13" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="40,0,0,10" /> </StackPanel> </StackPanel> </DataTemplate> <DataTemplate x:Key="FreeTextTemplate"> <Border BorderThickness="0" BorderBrush="Black" Margin="35,0,0,0" Padding="4"> <StackPanel Orientation="Horizontal" > <TextBlock Text="{Binding SrvyAnswer.SelectedAnswer}" IsEnabled="False" Height="Auto" Width="1400" TextWrapping="Wrap" FontSize="13" /> </StackPanel> </Border> </DataTemplate> <DataTemplate x:Key="RankingTemplate"> <telerik:RadListBox ItemsSource="{Binding SurveyQuestionAnswers}" VerticalAlignment="Top" ItemTemplate="{StaticResource SurveyQuestionsRankingDataTemplate}" /> </DataTemplate> <SurveyConverter:SurveyQuestionTypeConverter x:Key="sqtconverter" /> <SurveyTemplateRules:ConditionalDataTemplateSelector x:Key="selector" ConditionConverter="{StaticResource sqtconverter}"> <SurveyTemplateRules:ConditionalDataTemplateSelector.Rules> <SurveyTemplateRules:ConditionalDataTemplateRule DataTemplate="{StaticResource YesNoTemplate}"> <SurveyTemplateRules:ConditionalDataTemplateRule.Value> <sys:Int32>1</sys:Int32> </SurveyTemplateRules:ConditionalDataTemplateRule.Value> </SurveyTemplateRules:ConditionalDataTemplateRule> <SurveyTemplateRules:ConditionalDataTemplateRule DataTemplate="{StaticResource MultipleChoiceTemplate}"> <SurveyTemplateRules:ConditionalDataTemplateRule.Value> <sys:Int32>2</sys:Int32> </SurveyTemplateRules:ConditionalDataTemplateRule.Value> </SurveyTemplateRules:ConditionalDataTemplateRule> <SurveyTemplateRules:ConditionalDataTemplateRule DataTemplate="{StaticResource MultipleSelectTemplate}"> <SurveyTemplateRules:ConditionalDataTemplateRule.Value> <sys:Int32>3</sys:Int32> </SurveyTemplateRules:ConditionalDataTemplateRule.Value> </SurveyTemplateRules:ConditionalDataTemplateRule> <SurveyTemplateRules:ConditionalDataTemplateRule DataTemplate="{StaticResource FreeTextTemplate}"> <SurveyTemplateRules:ConditionalDataTemplateRule.Value> <sys:Int32>4</sys:Int32> </SurveyTemplateRules:ConditionalDataTemplateRule.Value> </SurveyTemplateRules:ConditionalDataTemplateRule> <SurveyTemplateRules:ConditionalDataTemplateRule DataTemplate="{StaticResource RankingTemplate}"> <SurveyTemplateRules:ConditionalDataTemplateRule.Value> <sys:Int32>5</sys:Int32> </SurveyTemplateRules:ConditionalDataTemplateRule.Value> </SurveyTemplateRules:ConditionalDataTemplateRule> </SurveyTemplateRules:ConditionalDataTemplateSelector.Rules> </SurveyTemplateRules:ConditionalDataTemplateSelector> <DataTemplate x:Key="RowDetailsTemplateForQuestions"> <telerik:RadGridView Name="surveyQuestionsGrid" ItemsSource="{Binding SurveyQuestions}" AutoGenerateColumns="False" IsReadOnly="True" ShowColumnSortIndexes="False" CanUserDeleteRows="False" CanUserInsertRows="False" CanUserSortColumns="False" CanUserFreezeColumns="False" CanUserGroupColumns="False" CanUserSelect="False" CanUserSortGroups="False" ShowGroupPanel="False" ShowColumnHeaders="False" GroupRenderMode="Flat" CanUserSelectColumns="False" GridLinesVisibility="None" RowIndicatorVisibility ="Collapsed" BorderBrush="White" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.CanContentScroll="True" RowDetailsTemplateSelector="{StaticResource selector}" RowDetailsVisibilityMode="Visible"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn Width="Auto"> <telerik:GridViewDataColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding SortOrder}" HorizontalAlignment="Right" VerticalAlignment="Top" Height="Auto" FontWeight="Bold" TextWrapping="Wrap" /> <!--<Label Content="." HorizontalAlignment="Left" VerticalAlignment="Top" Height="Auto" FontWeight="Bold"/>--> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> </telerik:GridViewDataColumn> <telerik:GridViewDataColumn Width="Auto"> <telerik:GridViewDataColumn.CellTemplate> <DataTemplate > <TextBlock Text="{Binding QuestionText}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="Auto" FontWeight="Bold" Width="1700" TextWrapping="Wrap" /> <!--<TextBlock TextAlignment="Left" TextWrapping="Wrap" Width="1700" Text="{Binding QuestionText}" FontWeight="Bold" Margin="0,10,0,10" ></TextBlock>--> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> </telerik:GridViewDataColumn> </telerik:RadGridView.Columns> </telerik:RadGridView> </DataTemplate> </Grid.Resources> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,10,0,0" Grid.Row="1"> <TextBlock Text="View Details Sort by Jurisdiction - " Grid.Row="0" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14" FontFamily="Segoe UI Semibold" /> <TextBlock Text="{Binding SurveyTitle}" Grid.Row="0" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14" FontFamily="Segoe UI Semibold" /> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,10,0,0" Grid.Row="2" Width="Auto"> <telerik:RadButton Content="Back To Survey Search" Width="150" Height="25" Grid.Row="0" HorizontalAlignment="Left" Margin="5 0 0 5" CornerRadius="10" Cursor="Hand" Command="{Binding BackToSurveySearch}"> <ToolTipService.ToolTip> <ToolTip Content="Back to Survey Search" /> </ToolTipService.ToolTip> </telerik:RadButton> <telerik:RadButton Content="Aggregate Results" Width="170" Height="25" Grid.Row="0" HorizontalAlignment="Left" Margin="10 0 0 5" CornerRadius="10" Cursor="Hand" Command="{Binding AggregateResults}"> <ToolTipService.ToolTip> <ToolTip Content="Aggregate Results" /> </ToolTipService.ToolTip> </telerik:RadButton> <telerik:RadButton Content="Details Sorted by Question" Width="170" Height="25" Grid.Row="0" HorizontalAlignment="Left" Margin="10 0 0 5" CornerRadius="10" Cursor="Hand" Command="{Binding DetailsSortedByQuestion}"> <ToolTipService.ToolTip> <ToolTip Content="View all details Sorted by Question" /> </ToolTipService.ToolTip> </telerik:RadButton> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,10,0,0" Grid.Row="3"> <TextBlock Text="Sort by Jurisdiction - " Grid.Row="0" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="12" FontFamily="Segoe UI Semibold" /> <telerik:RadComboBox x:Name="radComboBoxJurisdictionOptions" Width="220" VerticalAlignment="Center" SelectedIndex="0" SelectedValuePath="StateCode" DisplayMemberPath="StateName" Height="25" ItemsSource="{Binding Jurisdictions}" SelectedValue="{Binding SelectedJurisdictionCode}" SelectedItem="{Binding SelectedSurveyJurisdiction}" Command="{Binding ChangeJurisdictionCommand}" CommandParameter="{Binding Path=SelectedItem, ElementName=radComboBoxJurisdictionOptions }" AllowMultipleSelection="False"/> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0,10,0,10" Width="Auto" Grid.Row="4"> <telerik:RadGridView x:Name="rgvResponses" Width="Auto" ItemsSource="{Binding SurveyResponses}" AutoGenerateColumns="False" IsReadOnly="True" ShowColumnSortIndexes="False" CanUserDeleteRows="False" CanUserInsertRows="False" CanUserSortColumns="False" CanUserFreezeColumns="False" CanUserGroupColumns="False" CanUserSelect="False" CanUserSortGroups="False" ShowGroupPanel="False" ShowColumnHeaders="False" GroupRenderMode="Flat" CanUserSelectColumns="False" GridLinesVisibility="None" RowIndicatorVisibility ="Collapsed" BorderBrush="White" AlternationCount="1" AlternateRowBackground="LightGray" ScrollViewer.VerticalScrollBarVisibility="Visible" RowDetailsTemplate="{StaticResource RowDetailsTemplateForQuestions}" RowDetailsVisibilityMode="Visible"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn Width="Auto"> <telerik:GridViewDataColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Vertical" Margin="10,10,10,10"> <StackPanel Orientation="Horizontal"> <telerik:Label Content="Name:" FontWeight="Bold" Grid.Row="1" Grid.Column="0" Margin="0,0,5,0" HorizontalContentAlignment="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Width="150" /> <telerik:Label Name="txtAuthor" Content="{Binding FullName, Mode=OneWay}" Grid.Column="1" Grid.Row="0" FontWeight="Regular" HorizontalAlignment="Left" VerticalAlignment="Center" Width="Auto" /> </StackPanel> <StackPanel Orientation="Horizontal"> <telerik:Label Content="Attachment:" FontWeight="Bold" Grid.Row="2" Grid.Column="0" Margin="0,0,5,0" HorizontalContentAlignment="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Width="150" /> <TextBlock Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center" Width="Auto"> <Hyperlink Command="{Binding OpenAttachmentCommand}" CommandParameter="{Binding SurveyID}" > <TextBlock Text="{Binding FileName, Mode=OneWay}" FontWeight="Regular" ></TextBlock> </Hyperlink> </TextBlock> </StackPanel> <StackPanel Orientation="Horizontal"> <telerik:Label Content="Contact Info/Comments:" FontWeight="Bold" Grid.Row="3" Grid.Column="0" Margin="0,0,5,0" HorizontalAlignment="Right" VerticalAlignment="Top" Width="150"/> <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Comments, Mode=OneWay}" Margin="0,0,5,0" TextWrapping="Wrap" Height="Auto" Width="Auto" FontWeight="Regular" HorizontalAlignment="Left" VerticalAlignment="Center"/> </StackPanel> <StackPanel Orientation="Horizontal"> <telerik:Label Content="Jurisdiction:" FontWeight="Bold" Grid.Row="4" Grid.Column="0" Margin="0,0,5,0" HorizontalContentAlignment="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Width="150" /> <telerik:Label Name="txtJurisdiction" Content="{Binding Jurisdiction, Mode=OneWay}" Grid.Row="3" Grid.Column="1" FontWeight="Regular" HorizontalAlignment="Left" VerticalAlignment="Center" Width="Auto"/> </StackPanel> </StackPanel> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> </telerik:GridViewDataColumn> </telerik:RadGridView.Columns> </telerik:RadGridView> </StackPanel> <StackPanel Grid.Row="5" Width="Auto" > <telerik:RadDataPager x:Name="radDataPager" PageSize="1" IsTotalItemCountFixed="True" DisplayMode="All" ScrollViewer.VerticalScrollBarVisibility="Visible" FontSize="12" AutoEllipsisMode="Both" NumericButtonCount="10" Margin="0,10,0,0" Style="{StaticResource RadDataPagerStyle1}" Source="{Binding Items, ElementName=rgvResponses}" /> </StackPanel> </Grid> </Border></Grid>
ViewModel:
namespace .Survey.ViewModels{ public class SortByJurisdictionViewModel : BindableBase, INavigationAware { private IEventAggregator _eventAggregator; private ILogger _logger; private IRegionManager _regionManager; private SurveyDB _surveyDB; private SurveyService _surveyService; public DelegateCommand<object> BackToSurveySearch { get; private set; } public DelegateCommand<object> DetailsSortedByQuestion { get; private set; } public DelegateCommand<object> AggregateResults { get; private set; } public DelegateCommand<object> OpenAttachmentCommand { get; private set; } #region Page Properties private int _surveyID; public int SurveyID { set { _surveyID = value; RaisePropertyChanged("SurveyID"); } get { return _surveyID; } } private string _surveyTitle; public string SurveyTitle { set { _surveyTitle = value; RaisePropertyChanged("SurveyTitle"); } get { return _surveyTitle; } } public SurveyResponse _surveyResponseItems; public SurveyResponse SurveyResponseItems { get { return _surveyResponseItems; } set { _surveyResponseItems = value; RaisePropertyChanged("SurveyResponseItems"); } } public ObservableCollection<SurveyResponse> _surveyResponses { set; get; } public ObservableCollection<SurveyResponse> SurveyResponses { set { _surveyResponses = value; RaisePropertyChanged("SurveyResponses"); } get { return _surveyResponses; } } public ObservableCollection<SurveyQuestion> _surveyQuestions { set; get; } public ObservableCollection<SurveyQuestion> SurveyQuestions { set { _surveyQuestions = value; RaisePropertyChanged("SurveyQuestions"); } get { return _surveyQuestions; } } List<SurveyJurisdiction> _jurisdictions; public List<SurveyJurisdiction> Jurisdictions { get { return this._jurisdictions; } set { _jurisdictions = value; RaisePropertyChanged("Jurisdictions"); } } private SurveyJurisdiction _selectedSurveyJurisdiction; public SurveyJurisdiction SelectedSurveyJurisdiction { set { _selectedSurveyJurisdiction = value; RaisePropertyChanged("SelectedSurveyJurisdiction"); } get { return _selectedSurveyJurisdiction; } } private ICommand changeJurisdictionCommand = null; public ICommand ChangeJurisdictionCommand { get { return this.changeJurisdictionCommand; } set { if (this.changeJurisdictionCommand != value) { this.changeJurisdictionCommand = value; RaisePropertyChanged("ChangeJurisdictionCommand"); } } } #endregion public SortByJurisdictionViewModel(ILogger logger, SurveyDB survey, IEventAggregator ea, SurveyService surveyService, NetForumCore netForumCoreDB, IRegionManager rm) { _logger = logger; _eventAggregator = ea; _surveyDB = survey; _regionManager = rm; _netForumCoreDB = netForumCoreDB; _surveyService = surveyService; _eventAggregator.GetEvent<AppEnvironmentChange>().Subscribe(OnEnvironmentChange); BackToSurveySearch = new DelegateCommand<object>(LaunchSurveySearch); DetailsSortedByQuestion = new DelegateCommand<object>(LaunchDetailsSortedByQuestion); AggregateResults = new DelegateCommand<object>(LaunchAggregateResults); OpenAttachmentCommand = new DelegateCommand<object>(OnClickOpenAttachmentCommand); this.ChangeJurisdictionCommand = new Telerik.Windows.Controls.DelegateCommand(this.OnJurisdictionChanged); } private void OnClickOpenAttachmentCommand(object param) { string url = "https://xxx.xxx.org/Survey/User/FileDetail.aspx?SurveyFile=" + param; Utility.OpenExternalLink(url); } private void OnJurisdictionChanged(object param) { var sj = param as SurveyJurisdiction; LoadRecordsForJurisdiction(sj); } private void LoadRecordsForJurisdiction(SurveyJurisdiction sj) { if(sj != null) GetSurveyResponses(_logger, SurveyID,sj.StateCode, -1); } private void LaunchDetailsSortedByQuestion(object obj) { var uri = new Uri("SortByQuestion", UriKind.RelativeOrAbsolute); NavigationParameters p = new NavigationParameters(); p.Add("SurveyID", SurveyID); p.Add("SurveyTitle", SurveyTitle); _regionManager.RequestNavigate(SurveyModule.ContentRegionName, uri, p); } private void LaunchAggregateResults(object obj) { var uri = new Uri("AggregateResults", UriKind.RelativeOrAbsolute); NavigationParameters p = new NavigationParameters(); p.Add("SurveyID", SurveyID); p.Add("SurveyTitle", SurveyTitle); _regionManager.RequestNavigate(SurveyModule.ContentRegionName, uri, p); } private void LaunchSurveySearch(object obj) { var uri = new Uri("SurveySearch", UriKind.RelativeOrAbsolute); _regionManager.RequestNavigate("ContentRegion", uri); } private void OnEnvironmentChange(Environments obj) { // GetRecords(); RaisePropertyChanged(); // broadcast full refresh } #region navigation methods public void OnNavigatedTo(NavigationContext navigationContext) { var surveyID = navigationContext.Parameters["SurveyID"]; var title = navigationContext.Parameters["SurveyTitle"]; _surveyID = UConvert.ConvertToInt32(surveyID); _surveyTitle = UConvert.ConvertToString(title); RaisePropertyChanged("SurveyTitle"); GetSurveyResponses(_logger, SurveyID, string.Empty, -1); FillJurisdictionsDropDown(); } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } #endregion private void FillJurisdictionsDropDown() { this._jurisdictions = _surveyService.GetAllJurisdictions(_logger, _netForumCoreDB); // Remove states not in responses List<SurveyJurisdiction> removeRows = new List<SurveyJurisdiction>(); foreach (SurveyJurisdiction s in _jurisdictions) { string jur = UConvert.ConvertToString(s.StateCode); if (GetSurveyResponsesCount(SurveyID, jur) == 0) { removeRows.Add(s); } } foreach (SurveyJurisdiction surj in removeRows) { _jurisdictions.Remove(surj); } SurveyJurisdiction sj = new SurveyJurisdiction(); sj.StateCode = sj.StateName = sj.StateKey = ""; _jurisdictions.Insert(0, sj); Jurisdictions = _jurisdictions; RaisePropertyChanged("Jurisdictions"); } public int GetSurveyResponsesCount(int surveyID, string Juris) { DataTable dt = _surveyDB.GetSurveyResponses(SurveyID, Juris); if (dt != null) { return dt.Rows.Count; } return -1; } public void GetSurveyResponses(ILogger ilogger, int surveyID, string Juris, int SurveyResponseID) { ObservableCollection<SurveyResponse> surveyResponseItems = new ObservableCollection<SurveyResponse>(); DataTable dt = _surveyDB.GetSurveyResponses(SurveyID, Juris); try { if (dt != null) { if ((dt.Rows.Count > 0)) { foreach (DataRow row in dt.Rows) { SurveyResponse sItem = new SurveyResponse(ilogger, _surveyDB); sItem.SurveyID = UConvert.ConvertToInt32(row["SurveyID"]); sItem.SurveyResponseID = UConvert.ConvertToInt32(row["SurveyResponseID"]); sItem.Deleted = UConvert.ConvertToInt32(row["Deleted"]); sItem.ResponseDate = UConvert.ConvertToDateTime(row["ResponseDate"]); sItem.FullName = UConvert.ConvertToString(row["FullName"]); if(string.IsNullOrEmpty(sItem.FullName) ) sItem.FullName = "Anonymous"; sItem.UserName = UConvert.ConvertToString(row["UserName"]); sItem.Jurisdiction = UConvert.ConvertToString(row["Jurisdiction"]); sItem.Comments = UConvert.ConvertToString(row["Comments"]).Trim(); if (row["FileImage"] != DBNull.Value) { if (row["FileName"] != null && (Convert.ToString(row["FileName"]).Trim() != string.Empty)) sItem.FileName = Convert.ToString(row["FileName"]); sItem.FileType = Convert.ToString(row["FileType"]); sItem.FileSize = UConvert.ConvertToInt32(row["FileSize"]); sItem.FileImage = Convert.ToString(row["FileImage"]); } sItem.SurveyQuestions = GetSurveyQuestions(ilogger, sItem.SurveyID, sItem.SurveyResponseID); // sItem.SurveyQuestionAnswers = GetQuestionAnswers(sItem.SurveyQuestionID); surveyResponseItems.Add(sItem); } SurveyResponses = surveyResponseItems; } } } catch (Exception ex) { _logger?.LogError($"Failed during GetSurveyResponses method {ex.Message}"); throw; } } public ObservableCollection<SurveyQuestion> GetSurveyQuestions(ILogger ilogger, int surveyID, int surveyResponseID) { ObservableCollection<SurveyQuestion> surveyQuestions = new ObservableCollection<SurveyQuestion>(); DataTable dsQuestions = _surveyDB.GetQuestions(surveyID); if (dsQuestions != null) { if (dsQuestions != null && dsQuestions.Rows.Count > 0) { foreach (DataRow row in dsQuestions.Rows) { SurveyQuestion sq = new SurveyQuestion(ilogger, _surveyDB); sq.SortOrder = UConvert.ConvertToInt32(row["SortOrder"]); sq.SurveyQuestionID = UConvert.ConvertToInt32(row["SurveyQuestionID"]); sq.SurveyQuestionTypeID = UConvert.ConvertToInt32(row["SurveyQuestionTypeID"]); sq.SurveyID = UConvert.ConvertToInt32(row["SurveyID"]); sq.AllowComment = UConvert.ConvertToBoolean(row["AllowComment"]); sq.QuestionText = UConvert.ConvertToString(row["QuestionText"]); if (sq.SurveyQuestionTypeID == 3) { sq.SurveyAnswers = GetSurveyAnswersForMultipleSelect(surveyResponseID, sq.SurveyQuestionID); foreach (var answer in sq.SurveyAnswers) { //iterate only one record as all field values for comments are same sq.SurveyAnswersCommentForMultipleSelect = answer.Comments; break; } sq.SurveyQuestionAnswers = GetQuestionAnswers(sq.SurveyQuestionID, sq.SurveyAnswers); //choices } else { sq.SrvyAnswer = GetSurveyAnswer(surveyResponseID, sq.SurveyQuestionID); sq.SurveyQuestionAnswers = GetQuestionAnswers(sq.SurveyQuestionID, sq.SrvyAnswer); //choices } surveyQuestions.Add(sq); } } } return surveyQuestions; } public ObservableCollection<SurveyQuestionAnswer> GetQuestionAnswers(int surveyQuestionID , SurveyAnswer surveyAnswer) //, int surveyQuestionTypeID) { DataTable dtSurveyQuestionChoices = null; ObservableCollection<SurveyQuestionAnswer> surveyQuestionnAnswers = new ObservableCollection<SurveyQuestionAnswer>(); try { dtSurveyQuestionChoices = _surveyDB.GetQuestionAnswers(_logger, surveyQuestionID); if (dtSurveyQuestionChoices != null && dtSurveyQuestionChoices.Rows.Count > 0) { foreach (DataRow row in dtSurveyQuestionChoices.Rows) { SurveyQuestionAnswer surveyQuestionAnswer = new SurveyQuestionAnswer(_logger, _surveyDB); surveyQuestionAnswer.SurveyChoiceText = UConvert.ConvertToString(row["SurveyChoiceText"]); surveyQuestionAnswer.SurveyChoiceID = UConvert.ConvertToInt32(row["SurveyChoiceID"]); surveyQuestionAnswer.SortOrder = UConvert.ConvertToInt32(row["SortOrder"]); surveyQuestionAnswer.SurveyQuestionID = UConvert.ConvertToInt32(row["SurveyQuestionID"]); surveyQuestionAnswer.IsChecked = (surveyAnswer.SelectedAnswerValue.Equals(surveyQuestionAnswer.SurveyChoiceID))? true : false; surveyQuestionnAnswers.Add(surveyQuestionAnswer); } } } catch { throw; } return surveyQuestionnAnswers; } public ObservableCollection<SurveyQuestionAnswer> GetQuestionAnswers(int surveyQuestionID, ObservableCollection<SurveyAnswer> surveyAnswers) //, int surveyQuestionTypeID) { DataTable dtSurveyQuestionChoices = null; ObservableCollection<SurveyQuestionAnswer> surveyQuestionnAnswers = new ObservableCollection<SurveyQuestionAnswer>(); try { dtSurveyQuestionChoices = _surveyDB.GetQuestionAnswers(_logger, surveyQuestionID); if (dtSurveyQuestionChoices != null && dtSurveyQuestionChoices.Rows.Count > 0) { foreach (DataRow row in dtSurveyQuestionChoices.Rows) { SurveyQuestionAnswer surveyQuestionAnswer = new SurveyQuestionAnswer(_logger, _surveyDB); surveyQuestionAnswer.SurveyChoiceText = UConvert.ConvertToString(row["SurveyChoiceText"]); surveyQuestionAnswer.SurveyChoiceID = UConvert.ConvertToInt32(row["SurveyChoiceID"]); surveyQuestionAnswer.SortOrder = UConvert.ConvertToInt32(row["SortOrder"]); surveyQuestionAnswer.SurveyQuestionID = UConvert.ConvertToInt32(row["SurveyQuestionID"]); foreach (var answer in surveyAnswers) { if (answer.SelectedAnswerValue.Equals(surveyQuestionAnswer.SurveyChoiceID)) { surveyQuestionAnswer.IsChecked = true; break; } else { surveyQuestionAnswer.IsChecked = false; } } surveyQuestionnAnswers.Add(surveyQuestionAnswer); } } } catch { throw; } return surveyQuestionnAnswers; } public ObservableCollection<SurveyAnswer> GetSurveyAnswersForMultipleSelect(int surveyResponseID, int surveyQuestionID) //, int surveyQuestionTypeID) { DataTable dtSurveyAnswers = null; ObservableCollection<SurveyAnswer> surveyAnswers = new ObservableCollection<SurveyAnswer>(); try { dtSurveyAnswers = _surveyDB.GetSurveyAnswer(_logger, surveyResponseID, surveyQuestionID); if (dtSurveyAnswers != null && dtSurveyAnswers.Rows.Count > 0) { foreach (DataRow row in dtSurveyAnswers.Rows) { SurveyAnswer surveyAnswer = new SurveyAnswer(_logger, _surveyDB); surveyAnswer.SurveyAnswerID = UConvert.ConvertToInt32(row["SurveyAnswerID"]); surveyAnswer.SurveyResponseID = UConvert.ConvertToInt32(row["SurveyResponseID"]); surveyAnswer.SurveyQuestionID = UConvert.ConvertToInt32(row["SurveyQuestionID"]); surveyAnswer.Comments = UConvert.ConvertToString(row["Comments"]); surveyAnswer.SelectedAnswer = UConvert.ConvertToString(row["SelectedAnswer"]); surveyAnswer.SelectedAnswerValue = UConvert.ConvertToInt32(row["SelectedAnswerValue"]); surveyAnswers.Add(surveyAnswer); } } } catch { throw; } return surveyAnswers; } public SurveyAnswer GetSurveyAnswer(int surveyResponseID, int surveyQuestionID) //, int surveyQuestionTypeID) { DataTable dtSurveyAnswers = null; SurveyAnswer surveyAnswer = new SurveyAnswer(_logger, _surveyDB); try { dtSurveyAnswers = _surveyDB.GetSurveyAnswer(_logger, surveyResponseID, surveyQuestionID); if (dtSurveyAnswers != null && dtSurveyAnswers.Rows.Count > 0) { foreach (DataRow row in dtSurveyAnswers.Rows) { surveyAnswer.SurveyAnswerID = UConvert.ConvertToInt32(row["SurveyAnswerID"]); surveyAnswer.SurveyResponseID = UConvert.ConvertToInt32(row["SurveyResponseID"]); surveyAnswer.SurveyQuestionID = UConvert.ConvertToInt32(row["SurveyQuestionID"]); surveyAnswer.Comments = UConvert.ConvertToString(row["Comments"]); surveyAnswer.SelectedAnswer = UConvert.ConvertToString(row["SelectedAnswer"]); surveyAnswer.SelectedAnswerValue = UConvert.ConvertToInt32(row["SelectedAnswerValue"]); //For Radio button YES Answer if (surveyAnswer.SelectedAnswerValue == 1) surveyAnswer.IsYesChecked = true; else surveyAnswer.IsYesChecked = false; //For Radio button NO Answer if (surveyAnswer.SelectedAnswerValue == 0) surveyAnswer.IsNoChecked = true; else surveyAnswer.IsNoChecked = false; } } } catch { throw; } return surveyAnswer; } }}Thanks!