Example #1
0
        public void ResultsComparison()
        {
            const string results1          = "BridgeBelote1";
            const string results2          = "BridgeBelote2";
            const string resultsComparison = "Results Comparison";
            const string dropDowns         = "DropDowns";

            ExcelApplication.EnableEvents = true;

            if (Dealings1 == null)
            {
                // No Dealings loaded
                MessageBox.Show("Please load Dealings1 before proceeding", "Bridge Belote", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (!ExcelApplication.ActiveWorkbook.Worksheets.Any(p => ((Worksheet)p).Name.Equals(results1, StringComparison.InvariantCultureIgnoreCase)))
            {
                // Wrong workbook
                MessageBox.Show("Document doesn't appear to hold valid Bridge Belote results", $"{results1}", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var reply = MessageBox.Show("Include BridgeBelote2 results in the analysis?", "Analysis", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

            var inludeBridgeBelote2 = reply == DialogResult.Yes;

            if (inludeBridgeBelote2)
            {
                // Check the Dealings2 related data
                if (Dealings2 == null)
                {
                    // No Dealings loaded
                    MessageBox.Show("Please load Dealings2 before proceeding", "Bridge Belote", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (!ExcelApplication.ActiveWorkbook.Worksheets.Any(p => ((Worksheet)p).Name.Equals(results2, StringComparison.InvariantCultureIgnoreCase)))
                {
                    // Wrong workbook
                    MessageBox.Show("Document doesn't appear to hold valid Bridge Belote results", $"{results2}", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }

            // Get the BridgeBelote [results] Worksheet and DropDowns. We'd like to add the new Worksheet in between the two
            var resultsWorksheet1  = (Worksheet)ExcelApplication.ActiveWorkbook.Worksheets.FirstOrDefault(p => ((Worksheet)p).Name.Equals(results1, StringComparison.InvariantCultureIgnoreCase));
            var resultsWorksheet2  = (Worksheet)ExcelApplication.ActiveWorkbook.Worksheets.FirstOrDefault(p => ((Worksheet)p).Name.Equals(results2, StringComparison.InvariantCultureIgnoreCase));
            var dropDownsWorksheet = (Worksheet)ExcelApplication.ActiveWorkbook.Worksheets.FirstOrDefault(p => ((Worksheet)p).Name.Equals(dropDowns, StringComparison.InvariantCultureIgnoreCase));

            // [Re]Create the "Results Comparison" worksheet
            ResultsComparisonWorksheet = (Worksheet)ExcelApplication.ActiveWorkbook.Worksheets.FirstOrDefault(p => ((Worksheet)p).Name.Equals(resultsComparison, StringComparison.InvariantCultureIgnoreCase));
            if (ResultsComparisonWorksheet != null)
            {
                ResultsComparisonWorksheet.Delete();
            }

            // Add the comparison Worksheet after the BridgeBelote one
            ResultsComparisonWorksheet      = (Worksheet)ExcelApplication.ActiveWorkbook.Worksheets.Add(dropDownsWorksheet);
            ResultsComparisonWorksheet.Name = resultsComparison;

            ResultsComparisonWorksheet.SelectionChangeEvent += OnSelectionChange;

            // Copy the headings rows
            var sourceHeadingsRange = resultsWorksheet1.Range("A1:O2") as Range;

            sourceHeadingsRange.Copy();

            // Target headings range
            var targetHeadingsRange = ResultsComparisonWorksheet.Range("A1:O2");

            // Copy the formatting
            targetHeadingsRange.PasteSpecial(XlPasteType.xlPasteFormats);
            // ... and the values
            targetHeadingsRange.Value = sourceHeadingsRange.Value;

            // Make sure columns in source and target are of the same width
            for (var i = 1; i <= 15; i++)
            {
                ResultsComparisonWorksheet.Columns[i].ColumnWidth = resultsWorksheet1.Columns[i].ColumnWidth;
            }

            var targetRowIndex = 3;

            secondSetStartIndex = MergeDealingResults(resultsWorksheet1, Dealings1, targetRowIndex);

            if (inludeBridgeBelote2)
            {
                // Note: We have no use for the return value at this stage
                MergeDealingResults(resultsWorksheet2, Dealings2, secondSetStartIndex);
            }

            // Freeze the top 2 rows in the ResultsComparisonWorksheet
            var activeWindow = ExcelApplication.ActiveWindow;

            ExcelApplication.Goto(ResultsComparisonWorksheet.Cells[2]);
            activeWindow.SplitRow    = 2;
            activeWindow.FreezePanes = true;
        }