public void AddValidation(Grid grid, DataViewBase dataView) { Action<string, Column> setValidator = delegate(string attributeName, Column col) { col.Validator = delegate(object value, object item) { Func<string,GridValidatorDelegate> indexer = dataView.GridValidationIndexer(); GridValidatorDelegate validationRule = indexer(attributeName); if (validationRule != null) return validationRule(value, item); else { ValidationResult result = new ValidationResult(); result.Valid = true; return result; } }; }; if (dataView.GridValidationIndexer() != null) { foreach (Column col in grid.GetColumns()) { string fieldName = col.Field; setValidator(fieldName, col); } } }
public static void SetUpGrids(TimeSheetViewModel vm) { GridOptions daysGridOpts = new GridOptions(); daysGridOpts.EnableCellNavigation = true; daysGridOpts.EnableColumnReorder = false; daysGridOpts.AutoEdit = false; daysGridOpts.Editable = true; daysGridOpts.RowHeight = 20; daysGridOpts.HeaderRowHeight = 25; daysGridOpts.ForceFitColumns = false; daysGridOpts.EnableAddRow = true; // Create Timesheet Grid DataViewBase daysDataView = vm.Days; List<Column> columns = new List<Column>(); GridDataViewBinder.BindRowIcon(GridDataViewBinder.AddColumn(columns, "", 50, "icon"), "activity"); XrmLookupEditor.BindColumn(GridDataViewBinder.AddColumn(columns, "Activity", 300, "activity"), vm.ActivitySearchCommand, "activityid", "subject", "activitytypecode"); GridDataViewBinder.AddColumn(columns, "Mon", 50, "day0"); GridDataViewBinder.AddColumn(columns, "Tue", 50, "day1"); GridDataViewBinder.AddColumn(columns, "Wed", 50, "day2"); GridDataViewBinder.AddColumn(columns, "Thu", 50, "day3"); GridDataViewBinder.AddColumn(columns, "Fri", 50, "day4"); GridDataViewBinder.AddColumn(columns, "Sat", 50, "day5"); GridDataViewBinder.AddColumn(columns, "Sun", 50, "day6"); daysGrid = new Grid("#timesheetGridContainer", daysDataView, columns, daysGridOpts); GridDataViewBinder daysDataBinder = new GridDataViewBinder(); daysDataBinder.DataBindEvents(daysGrid, daysDataView, "timesheetGridContainer"); // Set the totals row meta data daysDataView.OnGetItemMetaData += delegate(object item) { DayEntry day = (DayEntry)item; if (day != null && day.isTotalRow) { ItemMetaData metaData = new ItemMetaData(); metaData.Editor = null; metaData.Formatter = delegate(int row, int cell, object value, Column columnDef, object dataContext) { if (columnDef.Field == "activity") return "Total"; else return Formatters.DefaultFormatter(row, cell, value, columnDef, dataContext); }; metaData.CssClasses = "days_total_row"; return metaData; } else return null; }; daysDataBinder.DataBindSelectionModel(daysGrid, daysDataView); // --------------------------------------- // Sessions Grid // --------------------------------------- DataViewBase sessionsDataView = vm.SessionDataView; List<Column> sessionGridCols = new List<Column>(); GridDataViewBinder.AddEditIndicatorColumn(sessionGridCols); XrmTextEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Description", 200, "dev1_description")); XrmDateEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Date", 200, "dev1_starttime"), true); XrmTimeEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Start", 100, "dev1_starttime")).Validator = delegate(object value, object item) { dev1_session session = (dev1_session)item; DateTime newStartTime = (DateTime)value; ValidationResult result = new ValidationResult(); if (session.dev1_EndTime != null) { result.Valid = true; string valueText = (string)value; // Check if the end time is before the start time bool isValid = DateTimeEx.GetTimeDuration(newStartTime) < DateTimeEx.GetTimeDuration(session.dev1_EndTime); result.Valid = isValid; result.Message = "The start time must be before the end time"; } else result.Valid = true; return result; }; XrmTimeEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "End", 100, "dev1_endtime")).Validator = delegate(object value, object item) { dev1_session session = (dev1_session)item; DateTime newEndTime = (DateTime)value; ValidationResult result = new ValidationResult(); if (session.dev1_StartTime != null) { result.Valid = true; string valueText = (string)value; // Check if the end time is before the start time bool isValid = DateTimeEx.GetTimeDuration(session.dev1_StartTime) < DateTimeEx.GetTimeDuration(newEndTime); result.Valid = isValid; result.Message = "The end time must be after the start time"; } else result.Valid = true; return result; }; XrmDurationEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Duration", 200, "dev1_duration")); GridDataViewBinder sessionsDataBinder = new GridDataViewBinder(); sessionsGrid = sessionsDataBinder.DataBindXrmGrid(sessionsDataView, sessionGridCols, "sessionsGridContainer", null, true, true); sessionsDataBinder.DataBindSelectionModel(sessionsGrid, sessionsDataView); daysGrid.OnActiveCellChanged.Subscribe(delegate(EventData e, object args) { CellSelection activeCell = daysGrid.GetActiveCell(); if (activeCell != null) { if (activeCell.Cell < 2) { // Whole activity is selected vm.Days.SelectedDay = null; } else { vm.Days.SelectedDay = activeCell.Cell - 1; } } }); }
public static void SetUpGrids(TimeSheetViewModel vm) { // Create Timesheet Grid DataViewBase daysDataView = vm.Days; List<Column> columns = new List<Column>(); GridDataViewBinder.BindRowIcon(GridDataViewBinder.AddColumn(columns, "", 50, "icon"), "activity"); XrmLookupEditor.BindColumn(GridDataViewBinder.AddColumn(columns, "Account", 300, "account"), vm.AccountSeachCommand, "accountid", "name", null); XrmLookupEditor.BindColumn(GridDataViewBinder.AddColumn(columns, "Regarding", 300, "regardingObjectId"), vm.RegardingObjectSearchCommand, "id", "displayName", null); XrmLookupEditor.BindColumn(GridDataViewBinder.AddColumn(columns, "Activity", 300, "activity"), vm.ActivitySearchCommand, "activityid", "subject", "activitytypecode"); string[] daysOfWeek = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; int firstDayOfWeek = OrganizationServiceProxy.OrganizationSettings.WeekStartDayCode.Value.Value; GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek], 50, "day0"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 1], 50, "day1"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 2], 50, "day2"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 3], 50, "day3"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 4], 50, "day4"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 5], 50, "day5"); GridDataViewBinder.AddColumn(columns, daysOfWeek[firstDayOfWeek + 6], 50, "day6"); GridDataViewBinder daysDataBinder = new GridDataViewBinder(); daysDataBinder.SelectActiveRow = true; daysDataBinder.AddCheckBoxSelectColumn = false; daysGrid = daysDataBinder.DataBindXrmGrid(daysDataView, columns, "timesheetGridContainer", null, true, true); // Set the totals row meta data daysDataView.OnGetItemMetaData += delegate(object item) { ItemMetaData metaData = new ItemMetaData(); DayEntry day = (DayEntry)item; if (day != null && day.isTotalRow) { metaData.Editor = delegate(EditorArguments args) { return null; }; metaData.Columns = new Dictionary<object, Column>(); metaData.Columns["Account"] = new Column("editor", null); metaData.Columns["Regarding"] = new Column("editor", null); metaData.Columns["Activity"] = new Column("editor", null); metaData.Formatter = delegate(int row, int cell, object value, Column columnDef, object dataContext) { switch (columnDef.Field) { case "account": case "regardingObjectId": return ""; case "activity": return "Total"; default: return XrmDurationEditor.Formatter(row, cell, value, columnDef, dataContext); } }; metaData.CssClasses = "days_total_row"; } else { metaData.Formatter = delegate(int row, int cell, object value, Column columnDef, object dataContext) { switch (columnDef.Field) { case "account": case "regardingObjectId": case "activity": return XrmLookupEditor.Formatter(row, cell, value, columnDef, dataContext); default: return XrmDurationEditor.Formatter(row, cell, value, columnDef, dataContext); } }; } return metaData; }; daysDataBinder.DataBindSelectionModel(daysGrid, daysDataView); // --------------------------------------- // Sessions Grid // --------------------------------------- DataViewBase sessionsDataView = vm.SessionDataView; List<Column> sessionGridCols = new List<Column>(); GridDataViewBinder.AddEditIndicatorColumn(sessionGridCols); XrmTextEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Activity", 300, "activitypointer_subject")).Editor = null; XrmDateEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Date", 100, "dev1_starttime"), true); XrmTimeEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Start", 100, "dev1_starttime")).Validator = delegate(object value, object item) { dev1_session session = (dev1_session)item; DateTime newStartTime = (DateTime)value; ValidationResult result = new ValidationResult(); if (session.dev1_EndTime != null) { result.Valid = true; string valueText = (string)value; // Check if the end time is before the start time bool isValid = DateTimeEx.GetTimeDuration(newStartTime) < DateTimeEx.GetTimeDuration(session.dev1_EndTime); result.Valid = isValid; result.Message = "The start time must be before the end time"; } else result.Valid = true; return result; }; XrmTimeEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "End", 100, "dev1_endtime")).Validator = delegate(object value, object item) { dev1_session session = (dev1_session)item; DateTime newEndTime = (DateTime)value; ValidationResult result = new ValidationResult(); if (session.dev1_StartTime != null) { result.Valid = true; string valueText = (string)value; // Check if the end time is before the start time bool isValid = DateTimeEx.GetTimeDuration(session.dev1_StartTime) < DateTimeEx.GetTimeDuration(newEndTime); result.Valid = isValid; result.Message = "The end time must be after the start time"; } else result.Valid = true; return result; }; XrmDurationEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Duration", 70, "dev1_duration")); XrmTextEditor.BindColumn(GridDataViewBinder.AddColumn(sessionGridCols, "Description", 300, "dev1_description")); GridDataViewBinder sessionsDataBinder = new GridDataViewBinder(); sessionsDataBinder.SelectActiveRow = false; sessionsDataBinder.AddCheckBoxSelectColumn = true; sessionsGrid = sessionsDataBinder.DataBindXrmGrid(sessionsDataView, sessionGridCols, "sessionsGridContainer", null, true, true); sessionsGrid.OnBeforeEditCell.Subscribe(delegate(EventData e, object args) { // Stop the row from being edited if locked Entity item = (Entity)((EditEventData)args).item; bool result = sessionsDataView.OnBeforeEdit(item); Script.Literal("return {0}", result); }); daysGrid.OnActiveCellChanged.Subscribe(delegate(EventData e, object args) { CellSelection activeCell = daysGrid.GetActiveCell(); if (activeCell != null) { if (activeCell.Cell < StartDaysColumnIndex) { // Whole activity is selected vm.Days.SelectedDay = null; } else { vm.Days.SelectedDay = activeCell.Cell - (StartDaysColumnIndex-1); } } }); }
public virtual ValidationResult Validate() { object newValue = SerializeValue(); ValidationResult result = this.NativeValidation(newValue); if (result==null && _args.Column.Validator != null) { ValidationResult validationResults = _args.Column.Validator(newValue, _args.Item); if (!validationResults.Valid) { result = validationResults; } } if (result == null) { result = new ValidationResult(); result.Valid = true; result.Message = null; } return result; }
public static GridValidatorDelegate ConvertToGridValidation(ValidationRuleDelegate ruleDelegate) { GridValidatorDelegate validationFunction = delegate(object value, object item) { ValidationRules rules = new ValidationRules(); rules = ruleDelegate(rules,item, null); ValidationResult result = new ValidationResult(); result.Valid = true; Dictionary validationRules = Dictionary.GetDictionary(rules); foreach (string key in validationRules.Keys) { // Find the ko validation rule if (ValidationApi.Rules.ContainsKey(key)) { ValidationRule targetRule = (ValidationRule)ValidationApi.Rules[key]; ValidationRule sourceRule = (ValidationRule)validationRules[key]; result.Valid = targetRule.Validator(value, sourceRule.Params==null ? targetRule.Params : sourceRule.Params); result.Message = String.IsNullOrEmpty(targetRule.Message) ? sourceRule.Message : targetRule.Message; } else if (key == "validation") { // Anon rule - can be either a single or array - we assume it's an array created by the ValidationRules class List<AnonymousRule> anonRules = (List<AnonymousRule>)validationRules[key]; foreach (AnonymousRule rule in anonRules) { result.Valid = rule.validator(value); result.Message = rule.message; if (!result.Valid) break; } } if (!result.Valid) break; } return result; }; return validationFunction; }
public override ValidationResult NativeValidation(object newValue) { bool isValid = true; Number newValueNumber = NumberEx.Parse((string)newValue,numberFormatInfo); isValid = !(Number.IsNaN(newValueNumber)); isValid = isValid && (newValueNumber >= numberFormatInfo.MinValue) && (newValueNumber <= numberFormatInfo.MaxValue); if (!isValid) { ValidationResult result = new ValidationResult(); result.Valid = false; result.Message = String.Format("Please enter a number between {0} and {1}.",numberFormatInfo.MinValue,numberFormatInfo.MaxValue); return result; } return null; }