using System.Collections; using System.Collections.Generic; using System.Web.Util; namespace System.Web.UI.WebControls { public abstract class AutoFieldsGenerator : IAutoFieldGenerator, IStateManager { private List _autoGeneratedFieldProperties; private bool _tracking; internal bool InDataBinding { get; set; } internal object DataItem { get; set; } private ICollection CreateAutoGeneratedFieldsFromFieldProperties() { List autoFields = new List(); foreach (AutoGeneratedFieldProperties fieldProperties in AutoGeneratedFieldProperties) { autoFields.Add(CreateAutoGeneratedFieldFromFieldProperties(fieldProperties)); } return autoFields; } //internal for unit testing. protected internal List AutoGeneratedFieldProperties { get { if (_autoGeneratedFieldProperties == null) { _autoGeneratedFieldProperties = new List(); } return _autoGeneratedFieldProperties; } } /// /// Create a single autogenerated field. This function can be overridden to create a different AutoGeneratedField. /// protected virtual AutoGeneratedField CreateAutoGeneratedFieldFromFieldProperties(AutoGeneratedFieldProperties fieldProperties) { AutoGeneratedField field = new AutoGeneratedField(fieldProperties.DataField); string name = fieldProperties.Name; ((IStateManager)field).TrackViewState(); field.HeaderText = name; field.SortExpression = name; field.ReadOnly = fieldProperties.IsReadOnly; field.DataType = fieldProperties.Type; return field; } protected bool IsTrackingViewState { get { return _tracking; } } protected virtual void TrackViewState() { _tracking = true; foreach (object fieldProps in AutoGeneratedFieldProperties) { ((IStateManager)fieldProps).TrackViewState(); } } protected virtual void LoadViewState(object savedState) { if (savedState != null) { object[] autoGenFieldStateArray = (object[])savedState; int fieldCount = autoGenFieldStateArray.Length; AutoGeneratedFieldProperties.Clear(); for (int i = 0; i < fieldCount; i++) { AutoGeneratedFieldProperties fieldProps = new AutoGeneratedFieldProperties(); ((IStateManager)fieldProps).TrackViewState(); ((IStateManager)fieldProps).LoadViewState(autoGenFieldStateArray[i]); AutoGeneratedFieldProperties.Add(fieldProps); } } } protected virtual object SaveViewState() { // pack up the auto gen'd field properties int autoGenFieldPropsCount = AutoGeneratedFieldProperties.Count; object[] autoGenFieldState = new object[autoGenFieldPropsCount]; for (int i = 0; i < autoGenFieldPropsCount; i++) { autoGenFieldState[i] = ((IStateManager)AutoGeneratedFieldProperties[i]).SaveViewState(); } return autoGenFieldState; } /// /// Method that creates the AutoGeneratedFields. This would also typically populate the AutoGeneratedFieldProperties collection /// which are tracked by view state. /// /// public abstract List CreateAutoGeneratedFields(object dataItem, Control control); /// /// A flag to indicate whether Enum fields should be generated by this FieldGenerator. /// If this flag is not set, the FieldGenerator uses of /// to determine the default behavior which is /// true when RenderingCompatibility is greater than or equal to 4.5 and false in older versions. /// public bool? AutoGenerateEnumFields { get; set; } #region Implementation of IAutoFieldGenerator public virtual ICollection GenerateFields(Control control) { if (InDataBinding) { //Reset this collection as this would be populated by CreateAutoGenerateFields. _autoGeneratedFieldProperties = null; return CreateAutoGeneratedFields(DataItem, control); } else { return CreateAutoGeneratedFieldsFromFieldProperties(); } } #endregion #region Implementation of IStateManager bool IStateManager.IsTrackingViewState { get { return IsTrackingViewState; } } void IStateManager.LoadViewState(object savedState) { LoadViewState(savedState); } object IStateManager.SaveViewState() { return SaveViewState(); } void IStateManager.TrackViewState() { TrackViewState(); } #endregion } }