diff --git a/ClosedXML/Excel/Ranges/IXLRanges.cs b/ClosedXML/Excel/Ranges/IXLRanges.cs index cc6cdab..cadda81 100644 --- a/ClosedXML/Excel/Ranges/IXLRanges.cs +++ b/ClosedXML/Excel/Ranges/IXLRanges.cs @@ -19,6 +19,12 @@ /// The range to remove from this group. void Remove(IXLRange range); + /// + /// Removes all ranges from the collection optionally disposing them. + /// + /// + void RemoveAll(bool dispose = true); + Int32 Count { get; } Boolean Contains(IXLRange range); diff --git a/ClosedXML/Excel/Ranges/XLRanges.cs b/ClosedXML/Excel/Ranges/XLRanges.cs index fcca3f6..9a5c9b4 100644 --- a/ClosedXML/Excel/Ranges/XLRanges.cs +++ b/ClosedXML/Excel/Ranges/XLRanges.cs @@ -47,6 +47,14 @@ _ranges.RemoveAll(r => r.ToString() == range.ToString()); } + public void RemoveAll(bool dispose = true) + { + Count = 0; + if (dispose) + _ranges.ForEach(r => r.Dispose()); + _ranges.Clear(); + } + public int Count { get; private set; } public IEnumerator GetEnumerator() diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs index eff6f11..8171db0 100644 --- a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs @@ -387,5 +387,41 @@ Assert.AreEqual(1, ws.ConditionalFormats.Count()); Assert.AreEqual("C3:G4", ws.ConditionalFormats.Single().Range.RangeAddress.ToStringRelative()); } + + [Test] + public void RangesRemoveAllWithDispose() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:A2")); + ranges.Add(ws.Range("B1:B2")); + var rangesCopy = ranges.ToList(); + + ranges.RemoveAll(); + ws.FirstColumn().InsertColumnsBefore(1); + + Assert.AreEqual(0, ranges.Count); + // if ranges were disposed they addresses didn't change + Assert.AreEqual("A1:A2", rangesCopy.First().RangeAddress.ToString()); + Assert.AreEqual("B1:B2", rangesCopy.Last().RangeAddress.ToString()); + } + + [Test] + public void RangesRemoveAllWithoutDispose() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:A2")); + ranges.Add(ws.Range("B1:B2")); + var rangesCopy = ranges.ToList(); + + ranges.RemoveAll(false); + ws.FirstColumn().InsertColumnsBefore(1); + + Assert.AreEqual(0, ranges.Count); + // if ranges were not disposed they addresses should change + Assert.AreEqual("B1:B2", rangesCopy.First().RangeAddress.ToString()); + Assert.AreEqual("C1:C2", rangesCopy.Last().RangeAddress.ToString()); + } } }