Example #1
0
        DeleteDuplicateEdges
        (
            ListObject oEdgeTable,
            Object [,] aoVertex1NameValues,
            Object [,] aoVertex2NameValues,
            Object [,] aoThirdColumnValues,
            Boolean bGraphIsDirected
        )
        {
            Debug.Assert(oEdgeTable != null);
            Debug.Assert(aoVertex1NameValues != null);
            Debug.Assert(aoVertex2NameValues != null);
            AssertValid();

            // Deleting rows one by one is way too slow.  Instead, start by adding
            // a temporary column that has an empty cell for each row that should
            // be deleted.

            ListColumn oDeleteIfEmptyColumn;
            Range      oDeleteIfEmptyData;

            Object [,] aoDeleteIfEmptyValues;

            MarkRowsForDeletion(oEdgeTable, aoVertex1NameValues,
                                aoVertex2NameValues, aoThirdColumnValues, bGraphIsDirected,
                                out oDeleteIfEmptyColumn, out oDeleteIfEmptyData,
                                out aoDeleteIfEmptyValues);

            // The edge table will be sorted on the "delete if empty" column so
            // that all edges that need to be deleted are contiguous.  But first,
            // add another temporary column and set its values to the worksheet
            // row numbers.  This will be used later to restore the original sort
            // order.

            ListColumn oOriginalSortOrderColumn;

            if (!ExcelTableUtil.TryAddTableColumnWithRowNumbers(oEdgeTable,
                                                                OriginalSortOrderColumnName, ExcelTableUtil.AutoColumnWidth, null,
                                                                out oOriginalSortOrderColumn))
            {
                throw new InvalidOperationException(
                          "Can't add temporary sort column.");
            }

            SortEdgeTable(oEdgeTable, oDeleteIfEmptyData);

            DeleteMarkedRows(oEdgeTable, oDeleteIfEmptyData,
                             aoDeleteIfEmptyValues);

            // Restore the original sort order.

            SortEdgeTable(oEdgeTable, oOriginalSortOrderColumn.Range);

            oOriginalSortOrderColumn.Delete();
            oDeleteIfEmptyColumn.Delete();

            // The (deleted) original sort order column is now selected.  Select
            // something more sensible.

            oEdgeTable.HeaderRowRange.Select();
        }