You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

273 lines
7.5 KiB

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public enum SummaryOperation { Sum, Avg, Count, Custom }
public delegate void CustomSummaryOperation(string column, string groupName, object value);
public delegate object SummaryResultMethod(string column, string groupName);
/// <summary>
/// A class that represents a summary operation defined to a column
/// </summary>
public class GridViewSummary
{
#region Fields
private string _column;
private SummaryOperation _operation;
private CustomSummaryOperation _customOperation;
private SummaryResultMethod _getSummaryMethod;
private GridViewGroup _group;
private object _value;
private string _formatString;
private int _quantity;
private bool _automatic;
private bool _treatNullAsZero;
#endregion
#region Properties
public string Column
{
get { return _column; }
}
public SummaryOperation Operation
{
get { return _operation; }
}
public CustomSummaryOperation CustomOperation
{
get { return _customOperation; }
}
public SummaryResultMethod GetSummaryMethod
{
get { return _getSummaryMethod; }
}
public GridViewGroup Group
{
get { return _group; }
}
public object Value
{
get { return _value; }
}
public string FormatString
{
get { return _formatString; }
set { _formatString = value; }
}
public int Quantity
{
get { return _quantity; }
}
public bool Automatic
{
get { return _automatic; }
set { _automatic = value; }
}
public bool TreatNullAsZero
{
get { return _treatNullAsZero; }
set { _treatNullAsZero = value; }
}
#endregion
#region Constructors
private GridViewSummary(string col, GridViewGroup grp)
{
this._column = col;
this._group = grp;
this._value = null;
this._quantity = 0;
this._automatic = true;
this._treatNullAsZero = false;
}
public GridViewSummary(string col, string formatString, SummaryOperation op, GridViewGroup grp) : this(col, grp)
{
this._formatString = formatString;
this._operation = op;
this._customOperation = null;
this._getSummaryMethod = null;
}
public GridViewSummary(string col, SummaryOperation op, GridViewGroup grp) : this(col, String.Empty, op, grp)
{
}
public GridViewSummary(string col, string formatString, CustomSummaryOperation op, SummaryResultMethod getResult, GridViewGroup grp) : this(col, grp)
{
this._formatString = formatString;
this._operation = SummaryOperation.Custom;
this._customOperation = op;
this._getSummaryMethod = getResult;
}
public GridViewSummary(string col, CustomSummaryOperation op, SummaryResultMethod getResult, GridViewGroup grp) : this(col, String.Empty, op, getResult, grp)
{
}
#endregion
internal void SetGroup(GridViewGroup g)
{
this._group = g;
}
public bool Validate()
{
if (this._operation == SummaryOperation.Custom)
{
return (this._customOperation != null && this._getSummaryMethod != null);
}
else
{
return (this._customOperation == null && this._getSummaryMethod == null);
}
}
public void Reset()
{
this._quantity = 0;
this._value = null;
}
public void AddValue(object newValue)
{
// Increment to (later) calc the Avg or for other calcs
this._quantity++;
// Built-in operations
if (this._operation == SummaryOperation.Sum || this._operation == SummaryOperation.Avg)
{
if (this._value == null)
this._value = newValue;
else
this._value = PerformSum(this._value, newValue);
}
else
{
// Custom operation
if (this._customOperation != null)
{
// Call the custom operation
if ( this._group != null )
this._customOperation(this._column, this._group.Name, newValue);
else
this._customOperation(this._column, null, newValue);
}
}
}
public void Calculate()
{
if (this._operation == SummaryOperation.Avg)
{
this._value = PerformDiv(this._value, this._quantity);
}
if (this._operation == SummaryOperation.Count)
{
this._value = this._quantity;
}
else if (this._operation == SummaryOperation.Custom)
{
if (this._getSummaryMethod != null)
{
this._value = this._getSummaryMethod(this._column, null);
}
}
// if this.Operation == SummaryOperation.Avg
// this.Value already contains the correct value
}
#region Built-in Summary Operations
private object PerformSum(object a, object b)
{
object zero = 0;
if (a == null)
{
if (_treatNullAsZero)
a = 0;
else
return null;
}
if (b == null)
{
if (_treatNullAsZero)
b = 0;
else
return null;
}
// Convert to proper type before add
switch (a.GetType().FullName)
{
case "System.Int16": return Convert.ToInt16(a) + Convert.ToInt16(b);
case "System.Int32": return Convert.ToInt32(a) + Convert.ToInt32(b);
case "System.Int64": return Convert.ToInt64(a) + Convert.ToInt64(b);
case "System.UInt16": return Convert.ToUInt16(a) + Convert.ToUInt16(b);
case "System.UInt32": return Convert.ToUInt32(a) + Convert.ToUInt32(b);
case "System.UInt64": return Convert.ToUInt64(a) + Convert.ToUInt64(b);
case "System.Single": return Convert.ToSingle(a) + Convert.ToSingle(b);
case "System.Double": return Convert.ToDouble(a) + Convert.ToDouble(b);
case "System.Decimal": return Convert.ToDecimal(a) + Convert.ToDecimal(b);
case "System.Byte": return Convert.ToByte(a) + Convert.ToByte(b);
case "System.String": return a.ToString() + b.ToString();
}
return null;
}
private object PerformDiv(object a, int b)
{
object zero = 0;
if (a == null)
{
return (_treatNullAsZero ? zero : null);
}
// Don't raise an exception, just return null
if (b == 0)
{
return null;
}
// Convert to proper type before div
switch (a.GetType().FullName)
{
case "System.Int16": return Convert.ToInt16(a) / b;
case "System.Int32": return Convert.ToInt32(a) / b;
case "System.Int64": return Convert.ToInt64(a) / b;
case "System.UInt16": return Convert.ToUInt16(a) / b;
case "System.UInt32": return Convert.ToUInt32(a) / b;
case "System.Single": return Convert.ToSingle(a) / b;
case "System.Double": return Convert.ToDouble(a) / b;
case "System.Decimal": return Convert.ToDecimal(a) / b;
case "System.Byte": return Convert.ToByte(a) / b;
// Operator '/' cannot be applied to operands of type 'ulong' and 'int'
//case "System.UInt64": return Convert.ToUInt64(a) / b;
}
return null;
}
#endregion
}