1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
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> _autoGeneratedFieldProperties;
private bool _tracking;
internal bool InDataBinding {
get;
set;
}
internal object DataItem {
get;
set;
}
private ICollection CreateAutoGeneratedFieldsFromFieldProperties() {
List<AutoGeneratedField> autoFields = new List<AutoGeneratedField>();
foreach (AutoGeneratedFieldProperties fieldProperties in AutoGeneratedFieldProperties) {
autoFields.Add(CreateAutoGeneratedFieldFromFieldProperties(fieldProperties));
}
return autoFields;
}
//internal for unit testing.
protected internal List<AutoGeneratedFieldProperties> AutoGeneratedFieldProperties {
get {
if (_autoGeneratedFieldProperties == null) {
_autoGeneratedFieldProperties = new List<AutoGeneratedFieldProperties>();
}
return _autoGeneratedFieldProperties;
}
}
/// <devdoc>
/// Create a single autogenerated field. This function can be overridden to create a different AutoGeneratedField.
/// </devdoc>
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;
}
/// <summary>
/// Method that creates the AutoGeneratedFields. This would also typically populate the AutoGeneratedFieldProperties collection
/// which are tracked by view state.
/// </summary>
/// <returns></returns>
public abstract List<AutoGeneratedField> CreateAutoGeneratedFields(object dataItem, Control control);
/// <summary>
/// A flag to indicate whether Enum fields should be generated by this FieldGenerator.
/// If this flag is not set, the FieldGenerator uses <see cref='System.Web.UI.WebControls.Control.RenderingCompatibility'/> of
/// <see cref='System.Web.UI.WebControls.Control'/> to determine the default behavior which is
/// true when RenderingCompatibility is greater than or equal to 4.5 and false in older versions.
/// </summary>
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
}
}
|