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());
+ }
}
}