e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
151 lines
5.4 KiB
C#
151 lines
5.4 KiB
C#
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
|
|
}
|
|
}
|