154 lines
6.1 KiB
C#
154 lines
6.1 KiB
C#
|
namespace System.Web.DynamicData {
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Web.UI.WebControls;
|
|||
|
using System.Web.UI;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Specialized;
|
|||
|
|
|||
|
// Dynamically creates a field template for text or boolean fields
|
|||
|
internal class SimpleFieldTemplateUserControl : FieldTemplateUserControl {
|
|||
|
private const string TextBoxID = "TextBox";
|
|||
|
|
|||
|
// Used for edit scenariors, since we only have one value for these
|
|||
|
// simple fieldtemplates
|
|||
|
private Func<object> _valueExtrator;
|
|||
|
private List<BaseValidator> _validators;
|
|||
|
|
|||
|
protected SimpleFieldTemplateUserControl() {
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnInit(EventArgs e) {
|
|||
|
base.OnInit(e);
|
|||
|
// Add the validators to the field template
|
|||
|
InitializeValidators();
|
|||
|
}
|
|||
|
|
|||
|
protected override void ExtractValues(IOrderedDictionary dictionary) {
|
|||
|
if (_valueExtrator != null) {
|
|||
|
object value = _valueExtrator();
|
|||
|
string stringValue = value as string;
|
|||
|
dictionary[Column.Name] = (stringValue != null ? ConvertEditedValue(stringValue) : value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static SimpleFieldTemplateUserControl CreateBooleanTemplate(bool readOnly) {
|
|||
|
SimpleFieldTemplateUserControl control = new SimpleFieldTemplateUserControl();
|
|||
|
|
|||
|
var checkBox = new CheckBox();
|
|||
|
checkBox.Enabled = !readOnly;
|
|||
|
checkBox.DataBinding += (sender, e) => {
|
|||
|
if (control.FieldValue != null) {
|
|||
|
checkBox.Checked = (bool)control.FieldValue;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
if (!readOnly) {
|
|||
|
control._valueExtrator = () => checkBox.Checked;
|
|||
|
}
|
|||
|
|
|||
|
control.Controls.Add(checkBox);
|
|||
|
return control;
|
|||
|
}
|
|||
|
|
|||
|
public static SimpleFieldTemplateUserControl CreateTextTemplate(MetaColumn column, bool readOnly) {
|
|||
|
SimpleFieldTemplateUserControl control = new SimpleFieldTemplateUserControl();
|
|||
|
if (readOnly) {
|
|||
|
var literal = new Literal();
|
|||
|
literal.DataBinding += (sender, e) => {
|
|||
|
literal.Text = control.FieldValueString;
|
|||
|
};
|
|||
|
control.Controls.Add(literal);
|
|||
|
}
|
|||
|
else {
|
|||
|
var textBox = new TextBox();
|
|||
|
textBox.DataBinding += (sender, e) => {
|
|||
|
textBox.Text = control.FieldValueEditString;
|
|||
|
};
|
|||
|
// Logic copied from BoundField
|
|||
|
if (column.ColumnType.IsPrimitive) {
|
|||
|
textBox.Columns = 5;
|
|||
|
}
|
|||
|
control._valueExtrator = () => textBox.Text;
|
|||
|
textBox.CssClass = "DDTextBox";
|
|||
|
textBox.ID = TextBoxID;
|
|||
|
control.Controls.Add(textBox);
|
|||
|
control.CreateValidators(column);
|
|||
|
}
|
|||
|
|
|||
|
return control;
|
|||
|
}
|
|||
|
|
|||
|
internal void InitializeValidators() {
|
|||
|
if (_validators != null) {
|
|||
|
_validators.ForEach(v => Controls.Add(v));
|
|||
|
_validators.ForEach(v => SetUpValidator(v));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// This method create's validators for a particular column type. This should be as close to the the actual FieldTemplates (user controls) as possible.
|
|||
|
// DateTime -> Required, Regex
|
|||
|
// Integer -> Regex, Required, Range, Compare
|
|||
|
// Decimal -> Regex, Required, Range, Compare
|
|||
|
// Text -> Regex, Required
|
|||
|
// Enum -> Required
|
|||
|
private void CreateValidators(MetaColumn column) {
|
|||
|
if (_validators == null) {
|
|||
|
_validators = new List<BaseValidator>();
|
|||
|
}
|
|||
|
|
|||
|
// Exclude regular expression validator for enum columns
|
|||
|
if (column.GetEnumType() == null) {
|
|||
|
RegularExpressionValidator regularExpressionValidator = new RegularExpressionValidator {
|
|||
|
ControlToValidate = TextBoxID,
|
|||
|
Enabled = false,
|
|||
|
Display = ValidatorDisplay.Static,
|
|||
|
CssClass = "DDControl DDValidator"
|
|||
|
};
|
|||
|
_validators.Add(regularExpressionValidator);
|
|||
|
}
|
|||
|
|
|||
|
if (column.IsInteger || column.ColumnType == typeof(decimal) || column.ColumnType == typeof(double) || column.ColumnType == typeof(float)) {
|
|||
|
RangeValidator rangeValidator = new RangeValidator {
|
|||
|
ControlToValidate = TextBoxID,
|
|||
|
Enabled = false,
|
|||
|
Display = ValidatorDisplay.Static,
|
|||
|
MinimumValue = "0",
|
|||
|
MaximumValue = "100",
|
|||
|
CssClass = "DDControl DDValidator",
|
|||
|
Type = column.IsInteger ? ValidationDataType.Integer : ValidationDataType.Double
|
|||
|
};
|
|||
|
_validators.Add(rangeValidator);
|
|||
|
|
|||
|
CompareValidator compareValidator = new CompareValidator {
|
|||
|
ControlToValidate = TextBoxID,
|
|||
|
Enabled = false,
|
|||
|
Display = ValidatorDisplay.Static,
|
|||
|
Operator = ValidationCompareOperator.DataTypeCheck,
|
|||
|
CssClass = "DDControl DDValidator",
|
|||
|
Type = column.IsInteger ? ValidationDataType.Integer : ValidationDataType.Double
|
|||
|
};
|
|||
|
_validators.Add(compareValidator);
|
|||
|
}
|
|||
|
|
|||
|
RequiredFieldValidator requiredFieldValidator = new RequiredFieldValidator {
|
|||
|
ControlToValidate = TextBoxID,
|
|||
|
Enabled = false,
|
|||
|
CssClass = "DDControl DDValidator",
|
|||
|
Display = ValidatorDisplay.Static
|
|||
|
};
|
|||
|
_validators.Add(requiredFieldValidator);
|
|||
|
|
|||
|
|
|||
|
DynamicValidator dynamicValidator = new DynamicValidator {
|
|||
|
ControlToValidate = TextBoxID,
|
|||
|
CssClass = "DDControl DDValidator",
|
|||
|
Display = ValidatorDisplay.Static
|
|||
|
};
|
|||
|
_validators.Add(dynamicValidator);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|