private static void GetCountyElections(Control container, string stateElectionKey) { var stateCode = Elections.GetStateCodeFromKey(stateElectionKey); // We get a dictionary of counties with elections that match the stateElectionKey // Key: countyCode; Value: countyElectionKey // Counties without an election will not be in the dictionary // We include local elections too, to account for situations where there is no county // election but there are local elections. var countyElectionDictionary = ElectionsOffices.GetCountyAndLocalElections(stateElectionKey); // We can't forget the Ballot Measures... var countyReferendumDictionary = Referendums.GetCountyAndLocalElections(stateElectionKey); // merge them into the first dictionary foreach (var kvp in countyReferendumDictionary) { if (!countyElectionDictionary.ContainsKey(kvp.Key)) { countyElectionDictionary.Add(kvp.Key, kvp.Value); } } if (countyElectionDictionary.Count == 0) { return; } // For reporting we start with all counties for the state (it will be in // order by county name) and select only those in the election dictionary. var counties = CountyCache.GetCountiesByState(stateCode) .Where(countyElectionDictionary.ContainsKey).ToList(); var multiCountySection = new PlaceHolder(); multiCountySection.AddTo(container); // each county report is in its own accordion foreach (var countyCode in counties) { var countyName = CountyCache.GetCountyName(stateCode, countyCode); var countyElectionKey = countyElectionDictionary[countyCode]; var electionReport = new ElectionReportResponsive(); var countyReport = electionReport.GenerateReport(countyElectionKey, true, multiCountySection); for (var inx = 0; inx < countyReport.Controls.Count; inx += 2) { // this will always be a state report (for county reports, GenerateReport // is called directly. Inject the county name into the office title header for context var header = countyReport.Controls[inx] as HtmlContainerControl; header?.Controls.Add( new HtmlP { InnerText = countyName }.AddCssClasses("county-message")); } // move them to the content while (countyReport.Controls.Count > 0) { container.Controls.Add(countyReport.Controls[0]); } } }