namespace System.Web.DynamicData { using System; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections.Generic; using System.Globalization; using System.Web.Resources; using System.Diagnostics; /// /// Field type that can display DynamicData UI /// [Designer("System.Web.DynamicData.Design.DynamicFieldDesigner, " + AssemblyRef.SystemWebDynamicDataDesign)] public class DynamicField : DataControlField, IAttributeAccessor, IFieldFormattingOptions { private bool _customConvertEmptyStringToNullSet; private bool _customApplyFormatInEditModeSet; private MetaColumn _column; private IDictionary _attributes; /// /// same as base. uses column's display name if possible /// public override string HeaderText { get { object o = ViewState["HeaderText"]; if (o != null) return (string)o; // Default to the Column's DisplayName if (Column != null) return Column.DisplayName; // If we couldn't get it, use the name if the data field return DataField; } set { base.HeaderText = value; } } /// /// same as base. uses column's SortExpression property, if possible. /// public override string SortExpression { get { object o = ViewState["SortExpression"]; if (o != null) return (string)o; // Default to the Column's SortExpression if (Column != null) return Column.SortExpression; return String.Empty; } set { base.SortExpression = value; } } /// /// Determines whether the control validates client input or not, defaults to inherit from parent. /// [ Category("Behavior"), ResourceDescription("DynamicField_ValidateRequestMode"), DefaultValue(ValidateRequestMode.Inherit) ] public new ValidateRequestMode ValidateRequestMode { get { return base.ValidateRequestMode; } set { base.ValidateRequestMode = value; } } [ SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "ReadOnly", Justification="Matches DataBoundControlMode value"), DefaultValue(false), Category("Behavior"), ResourceDescription("DynamicField_ReadOnly"), ] /// /// Forces this DynamicField to always load a ReadOnly template /// public virtual bool ReadOnly { get { object o = ViewState["ReadOnly"]; return (o == null ? false : (bool)o); } set { ViewState["ReadOnly"] = value; } } /// /// The name of the column that this field handles /// [ Category("Data"), DefaultValue(""), ResourceDescription("DynamicControlFieldCommon_DataField") ] public virtual string DataField { get { object o = ViewState["DataField"]; return ((o == null) ? String.Empty : (string)o); } set { if (!String.Equals(value, ViewState["DataField"])) { ViewState["DataField"] = value; OnFieldChanged(); } } } /// /// The MetaColumn that this fiedl is working with /// protected MetaColumn Column { get { // Don't do anything in Design mode. In some cases in the Designer (in the Edit field dialog), // DesignMode actually returns true, so checking for a null Control provides an additional check. if (DesignMode || Control == null) return null; if (_column == null) { MetaTable table = Control.FindMetaTable(); if (table == null) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.DynamicControl_ControlNeedsToExistInADataControlUsingDynamicDataSource)); } _column = table.GetColumn(DataField); } return _column; } } /// /// An optional UIHint specified on the field /// [ Category("Behavior"), DefaultValue(""), ResourceDescription("DynamicControlFieldCommon_UIHint") ] public virtual string UIHint { get { object o = ViewState["UIHint"]; return ((o == null) ? String.Empty : (string)o); } set { if (!String.Equals(value, ViewState["UIHint"])) { ViewState["UIHint"] = value; OnFieldChanged(); } } } /// /// The validation group that the field template needs to be in /// [ Category("Behavior"), DefaultValue(""), ResourceDescription("DynamicControlFieldCommon_ValidationGroup") ] public virtual string ValidationGroup { get { object o = ViewState["ValidationGroup"]; return ((o == null) ? String.Empty : (string)o); } set { if (!String.Equals(value, ViewState["ValidationGroup"])) { ViewState["ValidationGroup"] = value; OnFieldChanged(); } } } /// /// See base class documentation /// protected override DataControlField CreateField() { return new DynamicField(); } /// /// See base class documentation /// public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) { base.InitializeCell(cell, cellType, rowState, rowIndex); if (cellType == DataControlCellType.DataCell) { DynamicControl control = CreateDynamicControl(); control.DataField = DataField; control.Mode = DetermineControlMode(rowState); // Copy various properties into the control if (_customApplyFormatInEditModeSet) { control.ApplyFormatInEditMode = ApplyFormatInEditMode; } if (_customConvertEmptyStringToNullSet) { control.ConvertEmptyStringToNull = ConvertEmptyStringToNull; } control.DataFormatString = DataFormatString; if (ViewState["HtmlEncode"] == null) { // There is no Column in Design Mode if (!DesignMode) { control.HtmlEncode = Column.HtmlEncode; } } else { control.HtmlEncode = HtmlEncode; } control.NullDisplayText = NullDisplayText; control.UIHint = UIHint; control.ValidationGroup = ValidationGroup; // Pass it all the extra declarative attributes that we got control.SetAttributes(_attributes); ConfigureDynamicControl(control); cell.Controls.Add(control); } } /// /// Provides a way for classes deriving from DynamicField to override how DynamicControl gets created. /// /// protected virtual DynamicControl CreateDynamicControl() { return new DynamicControl(); } /// /// Provides a hook to further modify a DynamicControl that was created by the InitializeCell method /// /// protected virtual void ConfigureDynamicControl(DynamicControl control) { Debug.Assert(control != null); } private DataBoundControlMode DetermineControlMode(DataControlRowState rowState) { if (ReadOnly) { return DataBoundControlMode.ReadOnly; } bool edit = (rowState & DataControlRowState.Edit) != 0; bool insert = (rowState & DataControlRowState.Insert) != 0; if (edit) { return DataBoundControlMode.Edit; } else if (insert) { return DataBoundControlMode.Insert; } else { return DataBoundControlMode.ReadOnly; } } /// /// See base class documentation /// public override void ExtractValuesFromCell(IOrderedDictionary dictionary, DataControlFieldCell cell, DataControlRowState rowState, bool includeReadOnly) { Misc.ExtractValuesFromBindableControls(dictionary, cell); } /// /// See base class documentation /// protected override void CopyProperties(DataControlField newField) { base.CopyProperties(newField); DynamicField field = ((DynamicField)newField); field.DataField = DataField; field.ApplyFormatInEditMode = ApplyFormatInEditMode; field.ConvertEmptyStringToNull = ConvertEmptyStringToNull; field.HtmlEncode = HtmlEncode; field.ReadOnly = ReadOnly; field.NullDisplayText = NullDisplayText; field.UIHint = UIHint; field.ValidationGroup = ValidationGroup; field.DataFormatString = DataFormatString; } #region IAttributeAccessor Members /// /// See IAttributeAccessor /// public string GetAttribute(string key) { if (_attributes == null) return String.Empty; return _attributes[key]; } /// /// See IAttributeAccessor /// public void SetAttribute(string key, string value) { if (_attributes == null) { _attributes = new Dictionary(); } _attributes[key] = value; } #endregion #region IFieldFormattingOptions Members /// /// See IFieldFormattingOptions /// [ Category("Behavior"), DefaultValue(false), ResourceDescription("DynamicControlFieldCommon_ConvertEmptyStringToNull") ] public bool ConvertEmptyStringToNull { get { object o = ViewState["ConvertEmptyStringToNull"]; return (o == null ? false : (bool)o); } set { _customConvertEmptyStringToNullSet = true; ViewState["ConvertEmptyStringToNull"] = value; } } /// /// See IFieldFormattingOptions /// [ Category("Behavior"), DefaultValue(false), ResourceDescription("DynamicControlFieldCommon_ApplyFormatInEditMode") ] public bool ApplyFormatInEditMode { get { object o = ViewState["ApplyFormatInEditMode"]; return (o == null ? false : (bool)o); } set { _customApplyFormatInEditModeSet = true; ViewState["ApplyFormatInEditMode"] = value; } } /// /// See IFieldFormattingOptions /// [ Category("Data"), DefaultValue(""), ResourceDescription("DynamicControlFieldCommon_DataFormatString") ] public string DataFormatString { get { object o = ViewState["DataFormatString"]; return (o == null ? String.Empty : (string)o); } set { ViewState["DataFormatString"] = value; } } /// /// See IFieldFormattingOptions /// [ Category("Behavior"), DefaultValue(true), ResourceDescription("DynamicControlFieldCommon_HtmlEncode") ] public bool HtmlEncode { get { object o = ViewState["HtmlEncode"]; return (o == null ? true : (bool)o); } set { ViewState["HtmlEncode"] = value; } } /// /// See IFieldFormattingOptions /// [ Category("Behavior"), DefaultValue(""), ResourceDescription("DynamicControlFieldCommon_NullDisplayText") ] public string NullDisplayText { get { object o = ViewState["NullDisplayText"]; return (o == null ? String.Empty : (string)o); } set { ViewState["NullDisplayText"] = value; } } #endregion } }