diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs index b506d05..c1e8e19 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs @@ -201,6 +201,7 @@ XLHyperlink Hyperlink { get; set; } IXLWorksheet Worksheet { get; } + IXLDataValidation DataValidation { get; } IXLDataValidation SetDataValidation(); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index d899eb1..89cea6e 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -140,12 +140,34 @@ } } + IXLDataValidation IXLCell.DataValidation + { + get { return DataValidation; } + } public XLDataValidation DataValidation { get { using (var asRange = AsRange()) - return asRange.DataValidation; + { + var dv = asRange.DataValidation; // Call the data validation to break it into pieces + foreach(var d in Worksheet.DataValidations) + { + var rs = d.Ranges; + if(rs.Count == 1) + { + var r = rs.Single(); + var ra1 = r.RangeAddress.ToStringRelative(); + var ra2 = asRange.RangeAddress.ToStringRelative(); + if (ra1.Equals(ra2)) + return d as XLDataValidation; + } + } + //return + // Worksheet.DataValidations.First( + // d => d.Ranges.Count == 1 && d.Ranges.Single().RangeAddress.ToStringRelative().Equals(asRange.RangeAddress.ToStringRelative())) as XLDataValidation; + } + return null; } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index e034671..d5b91ac 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -90,11 +90,15 @@ { get { + IXLDataValidation dataValidationToCopy = null; var dvEmpty = new List(); foreach (IXLDataValidation dv in Worksheet.DataValidations) { foreach (IXLRange dvRange in dv.Ranges.Where(dvRange => dvRange.Intersects(this))) { + if (dataValidationToCopy == null) + dataValidationToCopy = dv; + dv.Ranges.Remove(dvRange); foreach (var column in dvRange.Columns()) { @@ -146,6 +150,8 @@ var newRanges = new XLRanges {AsRange()}; var dataValidation = new XLDataValidation(newRanges); + if (dataValidationToCopy != null) + dataValidation.CopyFrom(dataValidationToCopy); Worksheet.DataValidations.Add(dataValidation); return dataValidation; diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs index 70d392e..ee5e105 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs @@ -21,10 +21,7 @@ var ws = wb.Worksheets.Add("People"); ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("A") - .CellBelow().SetValue("B") - .CellBelow().SetValue("") - .CellBelow().SetValue("D"); + .CellBelow().SetValue("A"); var table = ws.RangeUsed().CreateTable(); @@ -34,5 +31,22 @@ Assert.AreEqual("Error", ws.DataValidations.Single().ErrorTitle); } + [TestMethod] + public void Validation_persists_on_Cell_DataValidation() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("People"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B"); + + var table = ws.RangeUsed().CreateTable(); + + var dv = table.DataRange.SetDataValidation(); + dv.ErrorTitle = "Error"; + + Assert.AreEqual("Error", table.DataRange.FirstCell().DataValidation.ErrorTitle); + } } }