413 lines
14 KiB
C#
413 lines
14 KiB
C#
|
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;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Field type that can display DynamicData UI
|
||
|
/// </summary>
|
||
|
[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<string, string> _attributes;
|
||
|
|
||
|
/// <summary>
|
||
|
/// same as base. uses column's display name if possible
|
||
|
/// </summary>
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// same as base. uses column's SortExpression property, if possible.
|
||
|
/// </summary>
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Determines whether the control validates client input or not, defaults to inherit from parent.
|
||
|
/// </summary>
|
||
|
[
|
||
|
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"),
|
||
|
]
|
||
|
/// <summary>
|
||
|
/// Forces this DynamicField to always load a ReadOnly template
|
||
|
/// </summary>
|
||
|
public virtual bool ReadOnly {
|
||
|
get {
|
||
|
object o = ViewState["ReadOnly"];
|
||
|
return (o == null ? false : (bool)o);
|
||
|
}
|
||
|
set {
|
||
|
ViewState["ReadOnly"] = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// The name of the column that this field handles
|
||
|
/// </summary>
|
||
|
[
|
||
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// The MetaColumn that this fiedl is working with
|
||
|
/// </summary>
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// An optional UIHint specified on the field
|
||
|
/// </summary>
|
||
|
[
|
||
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// The validation group that the field template needs to be in
|
||
|
/// </summary>
|
||
|
[
|
||
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See base class documentation
|
||
|
/// </summary>
|
||
|
protected override DataControlField CreateField() {
|
||
|
return new DynamicField();
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See base class documentation
|
||
|
/// </summary>
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Provides a way for classes deriving from DynamicField to override how DynamicControl gets created.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
protected virtual DynamicControl CreateDynamicControl() {
|
||
|
return new DynamicControl();
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Provides a hook to further modify a DynamicControl that was created by the InitializeCell method
|
||
|
/// </summary>
|
||
|
/// <param name="control"></param>
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See base class documentation
|
||
|
/// </summary>
|
||
|
public override void ExtractValuesFromCell(IOrderedDictionary dictionary, DataControlFieldCell cell,
|
||
|
DataControlRowState rowState, bool includeReadOnly) {
|
||
|
Misc.ExtractValuesFromBindableControls(dictionary, cell);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See base class documentation
|
||
|
/// </summary>
|
||
|
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
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IAttributeAccessor
|
||
|
/// </summary>
|
||
|
public string GetAttribute(string key) {
|
||
|
if (_attributes == null)
|
||
|
return String.Empty;
|
||
|
return _attributes[key];
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IAttributeAccessor
|
||
|
/// </summary>
|
||
|
public void SetAttribute(string key, string value) {
|
||
|
if (_attributes == null) {
|
||
|
_attributes = new Dictionary<string, string>();
|
||
|
}
|
||
|
_attributes[key] = value;
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region IFieldFormattingOptions Members
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IFieldFormattingOptions
|
||
|
/// </summary>
|
||
|
[
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IFieldFormattingOptions
|
||
|
/// </summary>
|
||
|
[
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IFieldFormattingOptions
|
||
|
/// </summary>
|
||
|
[
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IFieldFormattingOptions
|
||
|
/// </summary>
|
||
|
[
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// See IFieldFormattingOptions
|
||
|
/// </summary>
|
||
|
[
|
||
|
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
|
||
|
}
|
||
|
}
|