GetRangeTrackBarRanges
(
NumericFilterParameters oNumericFilterParameters,
String sTableName,
out Decimal decAvailableMinimum,
out Decimal decAvailableMaximum,
out Decimal decSelectedMinimum,
out Decimal decSelectedMaximum,
out String sSelectedMinimumAddress,
out String sSelectedMaximumAddress
)
{
Debug.Assert(oNumericFilterParameters != null);
Debug.Assert( !String.IsNullOrEmpty(sTableName) );
AssertValid();
String sColumnName = oNumericFilterParameters.ColumnName;
// Excel values are Doubles, but NumericRangeTrackBar values are
// Decimal. (That's because NumericRangeTrackBar uses a NumericUpDown
// control, which can only handle Decimals.) This can cause problems
// with very small and very large numbers.
//
// For example, the available minimum number 1.54768660209645E-22
// becomes 1.547687E-22 when converted to a Decimal, and because the
// Decimal is greater than the Double, using that Decimal for the
// available minimum would always filter out the edge or vertex row
// that the 1.54768660209645E-22 came from.
//
// Fix this by rounding the available minimum down and the available
// maximum up if necessary.
Double dAvailableMinimum = oNumericFilterParameters.MinimumCellValue;
decAvailableMinimum = (Decimal)dAvailableMinimum;
if ( (Double)decAvailableMinimum > dAvailableMinimum)
{
decAvailableMinimum = Math.Floor(decAvailableMinimum);
}
Double dAvailableMaximum = oNumericFilterParameters.MaximumCellValue;
decAvailableMaximum = (Decimal)dAvailableMaximum;
if ( (Double)decAvailableMaximum < dAvailableMaximum)
{
decAvailableMaximum = Math.Ceiling(decAvailableMaximum);
}
// DynamicFilterUtil.GetDynamicFilterParameters() skips zero-width
// ranges, so this should always be true.
Debug.Assert(decAvailableMaximum > decAvailableMinimum);
// If there are already saved selected range settings for this filter
// and they don't exceed the actual cell values, use them.
if (
!m_oDynamicFilterSettings.TryGetSettings(sTableName, sColumnName,
out decSelectedMinimum, out decSelectedMaximum,
out sSelectedMinimumAddress, out sSelectedMaximumAddress)
||
decSelectedMinimum < decAvailableMinimum
||
decSelectedMinimum > decAvailableMaximum
||
decSelectedMaximum < decAvailableMinimum
||
decSelectedMaximum > decAvailableMaximum
)
{
// There were no saved selected range settings, or they can't be
// used. Set the selected range to the entire available range,
// then save the settings.
decSelectedMinimum = decAvailableMinimum;
decSelectedMaximum = decAvailableMaximum;
m_oDynamicFilterSettings.SetSettings(sTableName, sColumnName,
decSelectedMinimum, decSelectedMaximum,
out sSelectedMinimumAddress, out sSelectedMaximumAddress);
}
Debug.Assert(decSelectedMaximum >= decSelectedMinimum);
Debug.Assert( !String.IsNullOrEmpty(sSelectedMinimumAddress) );
Debug.Assert( !String.IsNullOrEmpty(sSelectedMaximumAddress) );
}