DevExpressGridHelper

using DevExpress.Utils;
using DevExpress.Web;
using DevExpress.Web.Mvc;
using DevExpress.Web.Mvc.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Platform.Code.Helpers
{
    public enum NAPColumnType
    {
        Bound = 0,
        Integer = 1,
        Decimal = 2,
        DateTime = 3,
        String = 4,
        Boolean = 5,
        Object = 6,
        Date = 7,
    }



    public enum NAPColumnControlType
    {
        None = 0,
        Textbox = 1,
        DropDownList = 2,
        Checkbox = 3,
        Hyperlink = 4,
        Memo = 5,
        DateEdit = 6,
        IntEdit = 7,
        DecimalEdit = 8,
        DateTimeEdit = 9,
        Button = 10,
        DropDownListTextBoxGroup = 11,
        TextboxWithButton = 12,
        DateWithoutOption = 13,
        TextRange = 14
    }

    public class DevExpressGridHelper
    {
        private GridViewSettings _Settings;
        public string gs_EditField = "";
        public string gs_Fields = "";
        public string gs_MandatoryField = "";

        public DevExpressGridHelper(GridViewSettings settings)
        {
            this._Settings = settings;
        }

        public void GridSetting(string as_FunCode)
        {
            this._Settings.Width = Unit.Percentage(100);
            this._Settings.SettingsEditing.Mode = GridViewEditingMode.Batch;

            this._Settings.SettingsEditing.BatchEditSettings.EditMode = GridViewBatchEditMode.Cell;
            this._Settings.SettingsEditing.BatchEditSettings.StartEditAction = GridViewBatchStartEditAction.Click;

            this._Settings.Styles.BatchEditModifiedCell.BackColor = Utils.GetColor.BatchEditModifiedCell;
            this._Settings.Styles.BatchEditDeletedRow.BackColor = Utils.GetColor.DeleteColor;
            this._Settings.Styles.BatchEditCell.BackColor = Utils.GetColor.BatchEditCellColor;
            this._Settings.Styles.SelectedRow.BackColor = Utils.GetColor.BackColor;
            this._Settings.Styles.SelectedRow.ForeColor = Utils.GetColor.ForeColor;

            this._Settings.ClientSideEvents.CustomizationWindowCloseUp = Utils.GetTranslation("CustomizationWindowCloseUp");
            this._Settings.SettingsBehavior.EnableCustomizationWindow = true;
            this._Settings.SettingsBehavior.AllowSelectByRowClick = true;

            this._Settings.SettingsAdaptivity.AdaptivityMode = GridViewAdaptivityMode.Off;
            this._Settings.SettingsAdaptivity.AdaptiveColumnPosition = GridViewAdaptiveColumnPosition.Right;
            this._Settings.SettingsAdaptivity.AdaptiveDetailColumnCount = 1;
            this._Settings.SettingsAdaptivity.AllowOnlyOneAdaptiveDetailExpanded = false;
            this._Settings.SettingsAdaptivity.HideDataCellsAtWindowInnerWidth = 0;

            this._Settings.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
            this._Settings.SettingsText.EmptyDataRow = Utils.GetTranslation("No data to display");

            this._Settings.CellEditorInitialize = (sender, e) =>
            {
                ASPxEdit editor = (ASPxEdit)e.Editor;
                editor.ValidationSettings.Display = Display.Dynamic;
            };
            this._Settings.CustomJSProperties = (s, e) =>
            {
                e.Properties["cpPageSize"] = ((MVCxGridView)s).SettingsPager.PageSize;
                Dictionary<object, int> visibleIndices = new Dictionary<object, int>();
                var lo_GridView = s as MVCxGridView;
                if (lo_GridView != null)
                {
                    for (int i = 0; i < lo_GridView.VisibleRowCount; i++)
                    {
                        var ls_RowValue = lo_GridView.GetRowValues(i, lo_GridView.KeyFieldName);
                        if (!visibleIndices.ContainsKey(ls_RowValue))
                        {
                            visibleIndices.Add(ls_RowValue, i);
                        }
                    }
                }
                e.Properties["cpIndices"] = visibleIndices;
            };
            this._Settings.CustomColumnDisplayText = (sender, e) =>
            {
                if (e.Column.FieldName == "RowNo")
                {
                    if (e.VisibleIndex >= 0)
                    {
                        e.DisplayText = (e.VisibleIndex + 1).ToString();
                        e.Value = (e.VisibleIndex + 1).ToString();
                    }
                }
                this.FormatDisplayText(e);
            };
            this._Settings.PreRender = (sender, e) =>
            {
                ASPxGridView gridView = (ASPxGridView)sender;
                gridView.FilterExpression = string.Empty;
            };
            this._Settings.CommandButtonInitialize = (sender, e) =>
            {
                if ((e.ButtonType == ColumnCommandButtonType.Update) || (e.ButtonType == ColumnCommandButtonType.Cancel))
                {
                    e.Visible = false;
                }
            };
            this._Settings.ClientLayout = (sender, e) =>
            {
                if (e.LayoutMode == ClientLayoutMode.Saving)
                {
                    if ((string)HttpContext.Current.Request.Cookies["bSave" + as_FunCode + this._Settings.Name + "Layout"].Value == "1")
                    {
                        HttpContext.Current.Response.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value = e.LayoutData;
                        Utils.SaveUserLayoutToDatabase(as_FunCode + this._Settings.Name, e.LayoutData);
                    }
                }
                else
                {
                    if (HttpContext.Current.Request.Cookies[as_FunCode + this._Settings.Name + "Layout"] == null || String.IsNullOrEmpty(HttpContext.Current.Request.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value))
                    {
                        HttpContext.Current.Response.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value = Utils.RestoreUserLayoutFromDatabase(as_FunCode + this._Settings.Name);

                    }
                    if (HttpContext.Current.Response.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value != null && HttpContext.Current.Response.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value != "")
                    {
                        e.LayoutData = HttpContext.Current.Response.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value;
                    }
                    else
                    {
                        e.LayoutData = HttpContext.Current.Request.Cookies[as_FunCode + this._Settings.Name + "Layout"].Value;
                    }
                }
                HttpContext.Current.Response.Cookies["bSave" + as_FunCode + this._Settings.Name + "Layout"].Value = "0";
            };
            this._Settings.CustomActionRouteValues = "";
        }

        public void GridExportSetting(string as_FileName)
        {
            this._Settings.SettingsExport.Styles.Cell.Font.Name = "Calibri";
            this._Settings.SettingsExport.Styles.Header.Font.Name = "Calibri";
            this._Settings.SettingsExport.FileName = as_FileName + "_" + System.DateTime.Today.ToString("yyyyMMdd");
            this._Settings.SettingsExport.RenderBrick = (sender, e) =>
            {
                MVCxGridViewColumn col = e.Column as MVCxGridViewColumn;
                HyperLinkProperties properties = col.PropertiesEdit as HyperLinkProperties;

                if (properties != null)
                {
                    properties.NavigateUrlFormatString = "";
                    col.ColumnType = MVCxGridViewColumnType.TextBox;
                }
            };
        }

        public void AddSelectCheckboxColumn()
        {
            this._Settings.CommandColumn.Visible = true;
            this._Settings.CommandColumn.Width = 50;
            this._Settings.CommandColumn.ShowClearFilterButton = true;
            this._Settings.CommandColumn.ShowSelectCheckbox = true;
            this._Settings.CommandColumn.SelectAllCheckboxMode = GridViewSelectAllCheckBoxMode.Page;

        }

        public void AddSelectRadioButtonColumn()
        {
            this._Settings.CommandColumn.Visible = true;
            this._Settings.CommandColumn.Width = 50;
            this._Settings.CommandColumn.ShowClearFilterButton = true;
            this._Settings.SettingsBehavior.AllowSelectSingleRowOnly = true;
            this._Settings.CommandColumn.ShowSelectCheckbox = true;
            this._Settings.CommandColumn.FixedStyle = GridViewColumnFixedStyle.Left;
        }

        public void AddScrollbar(int ai_Height)
        {
            this._Settings.Settings.HorizontalScrollBarMode = ScrollBarMode.Visible;
            this._Settings.Settings.VerticalScrollBarMode = ScrollBarMode.Visible;
            this._Settings.Settings.VerticalScrollableHeight = ai_Height;
        }

        public void AddGroupPanel()
        {
            this._Settings.Settings.ShowGroupPanel = true;
            this._Settings.SettingsText.GroupPanel = Utils.GetTranslation("Drag a column header here to group by that column");
        }

        public void AddPaging(int ai_PageSize, bool ab_ShowPaging = true)
        {
            this._Settings.SettingsPager.Visible = ab_ShowPaging;
            if (ab_ShowPaging)
            {
                this._Settings.SettingsPager.PageSize = ai_PageSize;
                this._Settings.SettingsPager.Position = PagerPosition.Top;
                this._Settings.SettingsPager.FirstPageButton.Visible = true;
                this._Settings.SettingsPager.LastPageButton.Visible = true;
                this._Settings.SettingsPager.PageSizeItemSettings.Visible = true;
                this._Settings.SettingsPager.PageSizeItemSettings.Items = Utils.GetPageSize();
            }
            else
            {
                this._Settings.SettingsPager.Mode = GridViewPagerMode.ShowAllRecords;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="ab_Visible"></param>
        /// <param name="ao_GridViewNewItemRowPosition"></param>
        /// <param name="ab_HasRecover"></param>
        /// <param name="ab_ConfirmDelete"></param>
        /// <param name="as_ConfirmDeleteText"></param>
        public void AddCommandColumnButton(HtmlHelper helper
            , bool ab_Visible = true
            , GridViewNewItemRowPosition ao_GridViewNewItemRowPosition = GridViewNewItemRowPosition.Bottom
            , bool ab_HasRecover = true
            , bool ab_ConfirmDelete = false
            , int ai_CommandColumnWidth = 40
            , bool ab_HasAddButton = true
            , bool ab_HasDeleteButton = true)
        {
            this._Settings.CommandColumn.ShowClearFilterButton = true;
            this._Settings.CommandColumn.Visible = ab_Visible;
            this._Settings.CommandColumn.ShowDeleteButton = ab_HasDeleteButton;
            this._Settings.SettingsCommandButton.DeleteButton.Text = "-";
            this._Settings.SettingsCommandButton.DeleteButton.RenderMode = GridCommandButtonRenderMode.Button;
            this._Settings.SettingsCommandButton.DeleteButton.Styles.Style.Font.Underline = false;
            this._Settings.SettingsEditing.BatchEditSettings.HighlightDeletedRows = ab_HasRecover;
            this._Settings.SettingsBehavior.ConfirmDelete = ab_ConfirmDelete;

            if (ab_ConfirmDelete)
                this._Settings.SettingsText.ConfirmDelete = Utils.GetMessage("2002", "[" + Utils.GenerateJson("1", Utils.GetTranslation("delete"), "String") + "]");

            this._Settings.CommandColumn.ShowRecoverButton = ab_HasRecover;
            this._Settings.SettingsCommandButton.RecoverButton.Text = "+";
            this._Settings.SettingsCommandButton.RecoverButton.RenderMode = GridCommandButtonRenderMode.Button;
            this._Settings.SettingsCommandButton.RecoverButton.Styles.Style.Font.Underline = false;
            this._Settings.CommandColumn.FixedStyle = GridViewColumnFixedStyle.Left;
            this._Settings.CommandColumn.Width = ai_CommandColumnWidth;
            this._Settings.SettingsEditing.NewItemRowPosition = ao_GridViewNewItemRowPosition;

            if (ab_HasAddButton)
            {
                this._Settings.CommandColumn.SetHeaderTemplateContent(c =>
                {
                    helper.DevExpress().Button(btnSettings =>
                    {
                        btnSettings.Text = "+";
                        btnSettings.Name = "btnAdd" + this._Settings.Name;
                        btnSettings.RenderMode = ButtonRenderMode.Button;
                        btnSettings.ControlStyle.Font.Underline = false;
                        btnSettings.Width = Unit.Percentage(100);
                        btnSettings.ClientVisible = ab_Visible;
                        btnSettings.ClientSideEvents.Click = "function (s,e){ " + this._Settings.Name + "_AddNewRow();}";
                        btnSettings.UseSubmitBehavior = false;
                    }).Render();
                });
            }
            this._Settings.CommandColumn.HeaderStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
        }

        public void AddColumn(string as_FieldName, string as_Caption, NAPColumnType ao_ColumnType, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", NAPColumnControlType ao_ControlType = NAPColumnControlType.None, object[] ao_Object = null)
        {
            this._Settings.Columns.Add(column =>
            {
                column.FieldName = as_FieldName;
                column.Caption = Utils.GetTranslation(as_Caption);
                this.ColumnSetting(column, ao_ColumnType, ai_Width, ab_EditFormSettingsVisible, as_DisplayFormatString, ao_ControlType, ao_Object);
            });

            if (ab_Editable)
                gs_EditField += as_FieldName + ",";

            gs_Fields += as_FieldName + ",";
        }

        public void ColumnSetting(MVCxGridViewColumn ao_Column, NAPColumnType ao_ColumnType, int ai_Width, bool ab_EditFormSettingsVisible, string as_DisplayFormatString, NAPColumnControlType ao_ControlType, object[] ao_Object)
        {
            switch (ao_ColumnType)
            {
                case NAPColumnType.DateTime:
                    ao_Column.Width = 120;
                    ao_Column.UnboundType = DevExpress.Data.UnboundColumnType.DateTime;
                    ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False;
                    break;
                case NAPColumnType.Integer:
                    ao_Column.Width = 80;
                    ao_Column.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
                    ao_Column.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
                    ao_Column.CellStyle.HorizontalAlign = HorizontalAlign.Right;
                    break;
                case NAPColumnType.Date:
                    ao_Column.Width = 90;
                    ao_Column.ColumnType = MVCxGridViewColumnType.DateEdit;
                    ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                    //column.PropertiesEdit.DisplayFormatString = "yyyyMMdd";
                    break;
                case NAPColumnType.String:
                    ao_Column.Width = 50;
                    ao_Column.UnboundType = DevExpress.Data.UnboundColumnType.String;
                    ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                    ao_Column.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
                    break;
                case NAPColumnType.Object:
                    SetColumnControl(ao_Column, ao_ControlType, ao_Object);
                    break;
            }
            if (!string.IsNullOrWhiteSpace(as_DisplayFormatString))
            {
                ao_Column.PropertiesEdit.DisplayFormatString = as_DisplayFormatString;
            }
            if (ai_Width != 0)
                ao_Column.Width = ai_Width;
            if (ab_EditFormSettingsVisible)
                ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
            else
                ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False;
        }

        public void FormatDisplayText(ASPxGridViewColumnDisplayTextEventArgs e)
        {
            DateTime ldt_DtTmp; //TryParse
            decimal lde_DeTmp; //TryParse
            int li_ITmp; //TryParse

            var value = e.GetFieldValue(e.Column.FieldName);

            //there is no FormatString for string
            if (e.Column.UnboundType == DevExpress.Data.UnboundColumnType.String)
            {
                return;
            }
            if (value != null && e.DisplayText == null && string.IsNullOrWhiteSpace(value.ToString()))
            {
                return;
            }
            if (value == null && !string.IsNullOrWhiteSpace(e.DisplayText))
            {
                return;
            }
            //For ListDataSource to Show Text
            if (value != null && e.DisplayText != null && e.DisplayText != value.ToString())
            {
                return;
            }

            var formatString = e.Column.PropertiesEdit.DisplayFormatString;
            if (string.IsNullOrWhiteSpace(formatString) && value != null)
            {
                switch (e.Column.UnboundType)
                {
                    case DevExpress.Data.UnboundColumnType.DateTime:
                        formatString = Code.Utils.GetFormatString.DateTimeDisplay;
                        if (DateTime.TryParse(value.ToString(), out ldt_DtTmp))
                        {
                            e.DisplayText = string.Format("{0:" + formatString + "}", ldt_DtTmp);
                        }
                        break;
                    case DevExpress.Data.UnboundColumnType.Decimal:
                        formatString = Code.Utils.GetFormatString.DecimalDisplay;
                        if (decimal.TryParse(value.ToString(), out lde_DeTmp))
                        {
                            e.DisplayText = string.Format("{0:" + formatString + "}", lde_DeTmp);
                        }
                        break;
                    case DevExpress.Data.UnboundColumnType.Integer:
                        formatString = Code.Utils.GetFormatString.IntDisplay;
                        if (int.TryParse(value.ToString(), out li_ITmp))

                        {
                            e.DisplayText = string.Format("{0:" + formatString + "}", li_ITmp);
                        }
                        if (value == DBNull.Value)
                        {
                            e.DisplayText = "";
                        }
                        break;
                    case DevExpress.Data.UnboundColumnType.Bound:
                        if (((DevExpress.Web.Mvc.MVCxGridViewColumn)e.Column).ColumnType != MVCxGridViewColumnType.Default)
                        {
                            switch (((DevExpress.Web.Mvc.MVCxGridViewColumn)e.Column).ColumnType)
                            {
                                case MVCxGridViewColumnType.TextBox:
                                    break;
                                case MVCxGridViewColumnType.DateEdit:
                                    formatString = Code.Utils.GetFormatString.DateEdit;
                                    if (DateTime.TryParse(value.ToString(), out ldt_DtTmp))
                                    {
                                        e.DisplayText = string.Format("{0:" + formatString + "}", ldt_DtTmp);
                                    }
                                    break;
                                case MVCxGridViewColumnType.SpinEdit:
                                    break;
                                case MVCxGridViewColumnType.TimeEdit:
                                    break;
                            }
                        }
                        break;
                }
            }
        }

        public void SetColumnControl(MVCxGridViewColumn ao_Column, NAPColumnControlType ao_ControlType, object[] ao_Object)
        {
            bool lb_IsRequired;
            int li_MaxLength;
            string ls_Text;
            string ls_Value;
            string ls_ValidationEvent;
            string urlFormatString;
            object lo_Model;

            switch (ao_ControlType)
            {
                case NAPColumnControlType.Textbox:
                    li_MaxLength = Convert.ToInt32(ao_Object[0]);
                    lb_IsRequired = ao_Object[1] == null ? false : Convert.ToBoolean(ao_Object[1]);
                    ls_ValidationEvent = ao_Object[2] == null ? null : ao_Object[2].ToString();
                    ao_Column.EditorProperties().TextBox(p =>
                    {
                        p.MaxLength = li_MaxLength;
                        p.ValidationSettings.RequiredField.IsRequired = lb_IsRequired;
                        p.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(ao_Column.Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        p.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(ao_Column.Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        p.ValidationSettings.EnableCustomValidation = ls_ValidationEvent != null;
                        p.ClientSideEvents.Validation = ls_ValidationEvent;
                    });
                    break;

                case NAPColumnControlType.DropDownList:
                    lo_Model = ao_Object[0];
                    ls_Text = ao_Object[1].ToString();
                    ls_Value = ao_Object[2].ToString();
                    lb_IsRequired = ao_Object[3] == null ? false : Convert.ToBoolean(ao_Object[3]);
                    ls_ValidationEvent = ao_Object[4] == null ? null : ao_Object[4].ToString();
                    ao_Column.EditorProperties().ComboBox(p =>
                    {
                        p.TextField = ls_Text;
                        p.ValueField = ls_Value;
                        p.ValueType = typeof(string);
                        p.DataSource = lo_Model;
                        p.ValidationSettings.RequiredField.IsRequired = lb_IsRequired;
                        p.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(ao_Column.Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        p.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(ao_Column.Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        p.ValidationSettings.EnableCustomValidation = ls_ValidationEvent != null;
                        p.ClientSideEvents.Validation = ls_ValidationEvent;
                    });
                    break;

                case NAPColumnControlType.Hyperlink:
                    ao_Column.ColumnType = MVCxGridViewColumnType.HyperLink;
                    HyperLinkProperties properties = ao_Column.PropertiesEdit as HyperLinkProperties;
                    urlFormatString = ao_Object[0].ToString();
                    properties.NavigateUrlFormatString = HttpUtility.UrlDecode(urlFormatString);
                    properties.TextField = ao_Column.Caption;
                    properties.Target = "_blank";
                    break;

                case NAPColumnControlType.Memo:
                    ao_Column.ColumnType = MVCxGridViewColumnType.Memo;
                    break;
            }
        }

        public void SetColumnConditionalFormatting(string as_FieldName, string as_Condition, GridConditionHighlightFormat ao_HighlightFormat)
        {
            this._Settings.FormatConditions.AddHighlight(as_FieldName, as_Condition, ao_HighlightFormat);
        }

        public void CommonColumnSetting(MVCxGridViewColumn ao_Column, string as_FieldName, string as_Caption, int ai_Width, bool ab_Editable, bool ab_EditFormSettingsVisible, string as_DisplayFormatString = "", bool ab_IsRequired = false)
        {
            ao_Column.FieldName = as_FieldName;
            ao_Column.Caption = Utils.GetTranslation(as_Caption);
            ao_Column.HeaderStyle.Wrap = DefaultBoolean.True;

            if (!string.IsNullOrWhiteSpace(as_DisplayFormatString))
            {
                ao_Column.PropertiesEdit.DisplayFormatString = as_DisplayFormatString;
            }
            if (ai_Width != 0)
                ao_Column.Width = ai_Width;
            if (ab_EditFormSettingsVisible)
                ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
            else
                ao_Column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False;

            ao_Column.CellStyle.BackColor = System.Drawing.Color.Transparent;
            if (ab_IsRequired)
                gs_MandatoryField += as_FieldName + ",";

            if (ab_Editable)
            {
                gs_EditField += as_FieldName + ",";
                ao_Column.CellStyle.BackColor = Utils.GetColor.EditableColor;
            }

            gs_Fields += as_FieldName + ",";
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="as_FieldName">Field name</param>
        /// <param name="as_Caption">Column caption</param>
        /// <param name="ao_ColumnType">Column type</param>
        /// <param name="ai_Width">Column width</param>
        /// <param name="ab_Editable">Column editable</param>
        /// <param name="ab_EditFormSettingsVisible">Column edit form settings visible</param>
        /// <param name="as_DisplayFormatString">Column display format string. e.g: yyyyMMdd HH:mm:ss</param>
        public void AddNormalColumn(string as_FieldName, string as_Caption, NAPColumnType ao_ColumnType, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "")
        {
            this._Settings.Columns.Add(column =>
            {
                switch (ao_ColumnType)
                {
                    case NAPColumnType.DateTime:
                        column.Width = 120;
                        column.UnboundType = DevExpress.Data.UnboundColumnType.DateTime;
                        column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False;
                        break;
                    case NAPColumnType.Integer:
                        column.Width = 80;
                        column.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
                        column.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
                        column.CellStyle.HorizontalAlign = HorizontalAlign.Right;
                        break;
                    case NAPColumnType.Date:
                        column.Width = 90;
                        column.ColumnType = MVCxGridViewColumnType.DateEdit;
                        column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                        //column.PropertiesEdit.DisplayFormatString = "yyyyMMdd";
                        break;
                    case NAPColumnType.String:
                        column.UnboundType = DevExpress.Data.UnboundColumnType.String;
                        column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                        column.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
                        break;
                }
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString);
            });

        }

        public void AddTextBoxColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", int ai_MaxLength = 0, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_Mask = null)
        {


            this._Settings.Columns.Add(column =>
        {
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);


            column.EditorProperties().TextBox(textBoxProperties =>
            {
                if (ai_MaxLength > 0) textBoxProperties.MaxLength = ai_MaxLength;
                if (!string.IsNullOrWhiteSpace(as_Mask))
                {
                    textBoxProperties.MaskSettings.Mask = as_Mask;
                    textBoxProperties.MaskSettings.IncludeLiterals = MaskIncludeLiteralsMode.All;
                }
                if (ab_IsRequired)
                {
                    textBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    textBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    textBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    textBoxProperties.ValidationSettings.EnableCustomValidation = true;
                    textBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }

            });
        });

        }

        public void AddDateEditorColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", string as_EditFormatString = "", DateTime? adt_MaxDate = null, DateTime? adt_MinDate = null, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_DropDownEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.DateEdit;
                column.EditorProperties().DateEdit(dateEditProperties =>
                {
                    dateEditProperties.UseMaskBehavior = true;
                    if (adt_MinDate != null) dateEditProperties.MinDate = (DateTime)adt_MinDate;
                    if (adt_MaxDate != null) dateEditProperties.MaxDate = (DateTime)adt_MaxDate;
                    //dateEditProperties.EditFormat = EditFormat.Date;
                    dateEditProperties.EditFormatString = as_EditFormatString;
                    dateEditProperties.DisplayFormatInEditMode = true;
                    dateEditProperties.EditFormat = EditFormat.Custom;
                    dateEditProperties.AllowUserInput = true;
                    dateEditProperties.AllowNull = true;
                    dateEditProperties.DisplayFormatString = as_DisplayFormatString;

                    if (ab_IsRequired)
                    {
                        dateEditProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                        dateEditProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        dateEditProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    }
                    if (as_EditFormatString == Utils.GetFormatString.DateTimeEdit)
                    {
                        dateEditProperties.TimeSectionProperties.Visible = true;
                        dateEditProperties.TimeSectionProperties.TimeEditProperties.EditFormat = EditFormat.Custom;
                        dateEditProperties.TimeSectionProperties.ShowHourHand = true;
                        dateEditProperties.TimeSectionProperties.TimeEditProperties.EditFormatString = "HH:mm:ss";
                        dateEditProperties.CalendarProperties.FastNavProperties.EnablePopupAnimation = true;
                        dateEditProperties.ClientSideEvents.DropDown = as_DropDownEvent;
                        dateEditProperties.ClientSideEvents.CloseUp = "function(s,e){if(s.GetValue()==null||yyyy_MM_dd(s.GetValue(),'/')=='100/01/01') {s.GetTimeEdit().SetValue(null);s.SetValue(null);}}";
                        dateEditProperties.ClientSideEvents.ValueChanged = "function(s,e){if(s.GetValue()==null||yyyy_MM_dd(s.GetValue(),'/')=='100/01/01') {s.GetTimeEdit().SetValue(null);s.SetValue(null);}}";
                    }
                    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                    {
                        dateEditProperties.ValidationSettings.EnableCustomValidation = true;
                        dateEditProperties.ClientSideEvents.Validation = as_ValidationEvent;
                    }
                });
            });

        }

        public void AddTimeEditorColumn(HtmlHelper helper, string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", string as_EditFormatString = "", bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {

                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);
                column.EditorProperties().TextBox(textBoxProperties =>
                {
                    textBoxProperties.MaxLength = 5;

                    textBoxProperties.MaskSettings.Mask = "00:00";
                    textBoxProperties.MaskSettings.IncludeLiterals = MaskIncludeLiteralsMode.All;
                    if (ab_IsRequired)
                    {
                        textBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                        textBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        textBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    }
                    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                    {
                        textBoxProperties.ValidationSettings.EnableCustomValidation = true;
                        textBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;
                    }
                });


            });
        }

        public void AddComboboxColumn(string as_FieldName, string as_Caption, object ao_Model, string as_ValueFieldName, string as_TextFieldName, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_SelectChangedEvent = null, string as_Type = "Int", object ao_CallbackRouteValues = null, string as_BeginCallback = null, string as_EndCallback = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.ComboBox;
                column.EditorProperties().ComboBox(comboBoxProperties =>
                {
                    comboBoxProperties.TextField = as_TextFieldName;
                    comboBoxProperties.ValueField = as_ValueFieldName;
                    comboBoxProperties.ValueType = as_Type == "Int" ? typeof(int) : typeof(string);
                    comboBoxProperties.DataSource = ao_Model;
                    if (ao_CallbackRouteValues != null) comboBoxProperties.CallbackRouteValues = ao_CallbackRouteValues;
                    if (as_BeginCallback != null) comboBoxProperties.ClientSideEvents.BeginCallback = as_BeginCallback;
                    if (as_EndCallback != null) comboBoxProperties.ClientSideEvents.EndCallback = as_EndCallback;
                    if (ab_IsRequired)
                    {
                        comboBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                        comboBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        comboBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        //if (!string.IsNullOrWhiteSpace(as_SelectChangedEvent))
                        //{
                        //    comboBoxProperties.ClientSideEvents.SelectedIndexChanged = as_SelectChangedEvent;
                        //}
                    }
                    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                    {
                        comboBoxProperties.ValidationSettings.EnableCustomValidation = true;
                        comboBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;

                    }
                    if (!string.IsNullOrWhiteSpace(as_SelectChangedEvent))
                    {
                        comboBoxProperties.ClientSideEvents.SelectedIndexChanged = as_SelectChangedEvent;
                    }
                    comboBoxProperties.EnableSynchronization = DefaultBoolean.True;
                });

            });

        }

        public void AddHyperlinkColumn(string as_FieldName, string as_Caption, string as_urlFormatString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.HyperLink;
                column.EditorProperties().HyperLink(hyperLinkProperties =>
                {
                    hyperLinkProperties.NavigateUrlFormatString = HttpUtility.UrlDecode(as_urlFormatString);
                    hyperLinkProperties.TextField = as_FieldName;
                    hyperLinkProperties.Target = "_blank";
                });

            });
        }

        public void AddMapHyperlinkColumn(HtmlHelper helper, string as_FieldName, string as_Caption, string as_urlFormatString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = null, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_LatFieldName = "", string as_LngFieldName = "")
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired, as_DisplayFormatString: as_DisplayFormatString);

                column.ColumnType = MVCxGridViewColumnType.HyperLink;
                column.SetDataItemTemplateContent(container =>
                {
                    if (container.VisibleIndex >= 0)
                    {

                        helper.DevExpress().HyperLink(hyperLinkProperties =>
                        {
                            var ls_KeyValue = container.KeyValue;
                            if (DataBinder.Eval(container.DataItem, as_FieldName) != DBNull.Value && DataBinder.Eval(container.DataItem, as_FieldName).ToString() != "")
                                if (as_DisplayFormatString == Utils.GetFormatString.DateTimeDisplay)
                                    hyperLinkProperties.Properties.Text = Convert.ToDateTime(DataBinder.Eval(container.DataItem, as_FieldName).ToString()).ToString(Utils.GetFormatString.DateTimeDisplay);
                                else
                                    hyperLinkProperties.Properties.Text = DataBinder.Eval(container.DataItem, as_FieldName).ToString();
                            hyperLinkProperties.Name = "lnk_" + as_FieldName + ls_KeyValue + Utils.GenerateRandom(4);
                            hyperLinkProperties.Properties.NavigateUrlFormatString = HttpUtility.UrlDecode(String.Format(as_urlFormatString, DataBinder.Eval(container.DataItem, as_LatFieldName), DataBinder.Eval(container.DataItem, as_LngFieldName)));
                            hyperLinkProperties.Properties.TextField = as_FieldName;
                            hyperLinkProperties.Properties.ClientSideEvents.Click = "function(s,e){window.open('" + hyperLinkProperties.Properties.NavigateUrlFormatString + "', '_blank')}";
                            hyperLinkProperties.Properties.Target = "_blank";
                        }).Render();
                    }
                    else
                    {
                        if (DataBinder.Eval(container.DataItem, as_FieldName) != null)
                            helper.ViewContext.Writer.Write(DataBinder.Eval(container.DataItem, as_FieldName).ToString());

                    }
                });



            });
        }

        public void AddMemoColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.Memo;
                column.EditorProperties().Memo(memoProperties =>
                {
                    if (ab_IsRequired)
                    {
                        memoProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                        memoProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        memoProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    }
                    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                    {
                        memoProperties.ValidationSettings.EnableCustomValidation = true;
                        memoProperties.ClientSideEvents.Validation = as_ValidationEvent;
                    }
                });
            });
        }

        public void AddCheckBoxColumn(string as_FieldName, string as_Caption, object ao_ValueChecked, object ao_ValueUnchecked, Type ao_ValueType, string as_ValueCheckedString, string as_ValueUncheckedString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.CheckBox;
                var checkBoxProperties = column.PropertiesEdit as CheckBoxProperties;
                checkBoxProperties.ValueChecked = ao_ValueChecked;
                checkBoxProperties.ValueUnchecked = ao_ValueUnchecked;
                checkBoxProperties.ValueType = ao_ValueType;
                checkBoxProperties.ValueCheckedString = as_ValueCheckedString;
                checkBoxProperties.ValueUncheckedString = as_ValueUncheckedString;
            });
        }

        public void AddCheckBoxColumnWithinHeader(HtmlHelper helper, string as_FieldName, string as_Caption, object ao_ValueChecked, object ao_ValueUnchecked, Type ao_ValueType, string as_ValueCheckedString, string as_ValueUncheckedString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

                column.SetHeaderTemplateContent(c =>
                {
                    helper.DevExpress().CheckBox(chkSettings =>
                    {
                        chkSettings.Text = as_Caption;
                        chkSettings.Name = "chk" + this._Settings.Name + as_FieldName + "_SelectAll";
                        chkSettings.ControlStyle.Font.Underline = false;
                        chkSettings.Width = Unit.Percentage(100);
                        chkSettings.ControlStyle.HorizontalAlign = HorizontalAlign.Center;
                        chkSettings.Properties.ClientSideEvents.CheckedChanged = "function (s,e){ On" + chkSettings.Name + "(s,e);}";
                    }).Render();
                });
                column.ColumnType = MVCxGridViewColumnType.CheckBox;
                var checkBoxProperties = column.PropertiesEdit as CheckBoxProperties;
                checkBoxProperties.ValueChecked = ao_ValueChecked;
                checkBoxProperties.ValueUnchecked = ao_ValueUnchecked;
                checkBoxProperties.ValueType = ao_ValueType;
                checkBoxProperties.ValueCheckedString = as_ValueCheckedString;
                checkBoxProperties.ValueUncheckedString = as_ValueUncheckedString;
                column.Settings.AllowSort = DefaultBoolean.False;

            });
        }

        public void AddHyperlinkDynamicClientSideColumn(string as_FieldName, string as_Caption, HtmlHelper helper, string[] aa_DataFieldName, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = null, string as_ClientSideEventName = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible);
                column.SetDataItemTemplateContent(container =>
                {
                    if (container.VisibleIndex < 0)
                        return;

                    object[] la_DataValue = new object[aa_DataFieldName.Length];
                    bool lb_Valid = true;
                    string ls_ValueString = "";
                    for (int i = 0; i < aa_DataFieldName.Length; i++)
                    {
                        if (!string.IsNullOrWhiteSpace(aa_DataFieldName[i]))
                        {
                            la_DataValue[i] = DataBinder.Eval(container.DataItem, aa_DataFieldName[i]);

                        }
                    }
                    for (int i = 0; i < la_DataValue.Length; i++)
                    {
                        if (la_DataValue[i] == null)
                        {
                            lb_Valid = false;
                        }
                        else
                        {
                            ls_ValueString = ls_ValueString + "'" + (la_DataValue[i] == DBNull.Value ? "" : la_DataValue[i].ToString()) + "',";


                        }
                    }

                    if (lb_Valid)
                    {

                        if (ls_ValueString != "")
                        {

                            ls_ValueString = ls_ValueString.Substring(0, ls_ValueString.Length - 1);
                            if (ls_ValueString != "''")
                            {
                                helper.DevExpress().HyperLink(hyperlink =>
                                {
                                    var ls_KeyValue = container.KeyValue;
                                    hyperlink.Name = "lnk_" + as_FieldName + ls_KeyValue + Utils.GenerateRandom(4);
                                    if (as_DisplayFormatString == Utils.GetFormatString.DateDisplay)
                                        hyperlink.Properties.Text = Convert.ToDateTime(DataBinder.Eval(container.DataItem, as_FieldName).ToString()).ToString(Utils.GetFormatString.DateDisplay);
                                    else
                                        hyperlink.Properties.Text = DataBinder.Eval(container.DataItem, as_FieldName).ToString();
                                    hyperlink.Properties.TextField = as_FieldName;
                                    hyperlink.Properties.ClientSideEvents.Click = "function (s,e){ " + as_ClientSideEventName + "(" + ls_ValueString + ");}";
                                    hyperlink.Properties.Target = "_blank";
                                }).Render();
                            }
                            else
                            {
                                helper.ViewContext.Writer.Write("");
                            }
                        }
                    }
                    else
                    {
                        if (DataBinder.Eval(container.DataItem, as_FieldName) != null)
                            helper.ViewContext.Writer.Write(DataBinder.Eval(container.DataItem, as_FieldName).ToString());

                    }


                });

            });
        }

        /// <summary>
        /// Only support decimal or Integer
        /// </summary>
        /// <param name="as_FieldName"></param>
        /// <param name="as_Caption"></param>
        /// <param name="ai_Width"></param>
        /// <param name="ab_Editable"></param>
        /// <param name="ab_EditFormSettingsVisible"></param>
        /// <param name="as_DisplayFormatString">Displayformat E.g n2,d</param>
        /// <param name="ao_NumberType">Decimal or Integer </param>
        /// <param name="afl_MinValue">Min value</param>
        /// <param name="afl_MaxValue">Max value</param>
        /// <param name="ab_IsRequired"></param>
        /// <param name="as_ValidationEvent"></param>
        public void AddNumberColumn(HtmlHelper helper, string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", SpinEditNumberType ao_NumberType = SpinEditNumberType.Float, float? afl_MinValue = null, float? afl_MaxValue = null, bool ab_IsRequired = false, string as_ValidationEvent = null, DevExpress.Data.SummaryItemType ao_SummaryType = DevExpress.Data.SummaryItemType.None, bool ab_IsRealTimeCalTotalSum = false)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired: ab_IsRequired);

                column.ColumnType = MVCxGridViewColumnType.TextBox;
                column.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
                column.CellStyle.HorizontalAlign = HorizontalAlign.Right;
                column.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;

                column.EditorProperties().SpinEdit(spinEditProperties =>
                {
                    spinEditProperties.NumberFormat = SpinEditNumberFormat.Custom;
                    spinEditProperties.DisplayFormatString = as_DisplayFormatString;
                    spinEditProperties.DisplayFormatInEditMode = true;
                    spinEditProperties.NumberType = ao_NumberType;

                    //spinEditProperties.AllowNull = false;
                    spinEditProperties.SpinButtons.Visible = false;
                    spinEditProperties.SpinButtons.ShowLargeIncrementButtons = false;
                    spinEditProperties.SpinButtons.ShowIncrementButtons = false;
                    spinEditProperties.Increment = 0;
                    spinEditProperties.AllowMouseWheel = false;
                    if (afl_MinValue != null) spinEditProperties.MinValue = (decimal)afl_MinValue;
                    if (afl_MaxValue != null) spinEditProperties.MaxValue = (decimal)afl_MaxValue;
                    if (ab_IsRequired)
                    {
                        spinEditProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                        spinEditProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                        spinEditProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    }
                    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                    {
                        spinEditProperties.ValidationSettings.EnableCustomValidation = true;
                        spinEditProperties.ClientSideEvents.Validation = as_ValidationEvent;
                    }
                });

                if (ab_IsRealTimeCalTotalSum)
                {
                    ASPxSummaryItem summaryItem = new ASPxSummaryItem(column.FieldName, DevExpress.Data.SummaryItemType.Sum);
                    summaryItem.Tag = "SummaryItem_Sum_" + column.FieldName;
                    this._Settings.TotalSummary.Add(summaryItem);
                    column.SetFooterTemplateContent(c =>
                    {

                        helper.DevExpress().Label(lbSettings =>
                        {
                            string fieldName = (c.Column as GridViewDataColumn).FieldName;
                            //c.data
                            lbSettings.Name = "lbl_Sum_" + fieldName;
                            lbSettings.Properties.EnableClientSideAPI = true;
                            ASPxSummaryItem summaryItem1 = c.Grid.TotalSummary.First(i => i.Tag == ("SummaryItem_Sum_" + fieldName));
                            lbSettings.Text = string.Format("{0:" + as_DisplayFormatString + "}", (c.Grid.GetTotalSummaryValue(summaryItem1) ?? 0));

                        }).Render();
                    });
                }
            });

            this._Settings.TotalSummary.Add(ao_SummaryType, as_FieldName).DisplayFormat = as_DisplayFormatString;
        }

        public void ChangeCellColor(dynamic ao_Model, ASPxGridViewTableDataCellEventArgs e)
        {
            //string[] la_Fields = this.gs_Fields.Split(',');
            //for (int i = 0; i < la_Fields.Count(); i++)
            //{
            for (int j = 0; j < ao_Model.Tables[0].Rows.Count; j++)
            {
                if (e.DataColumn.FieldName == ao_Model.Tables[0].Rows[j]["FieldName"].ToString())// && ao_Model.Tables[0].Rows[j]["FieldName"].ToString() == la_Fields[i].ToString())
                {
                    if (e.KeyValue != null && e.KeyValue.ToString() == ao_Model.Tables[0].Rows[j]["TableUID"].ToString() && ao_Model.Tables[0].Rows[j]["IsChanged"].ToString() == "1")
                    {
                        //if (e.DataColumn.FieldName == ao_Model.Tables[0].Rows[j][2].ToString())
                        //{
                        e.Cell.BackColor = Utils.GetColor.ChangedColor;
                        break;
                        //}
                    }
                }
            }
        }

        public void AddButtonColumn(HtmlHelper helper, string as_FieldName, string as_Caption, string as_ParamField, int ai_Width = 0,

            bool ab_EditFormSettingsVisible = false, string as_OnClickEvent = null)
        {
            this._Settings.Columns.Add(column =>
            {
                this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, false, ab_EditFormSettingsVisible, "", false);

                column.UnboundType = DevExpress.Data.UnboundColumnType.String;
                //column.EditorProperties().TextBox(textBoxProperties =>
                //{
                //    if (ai_MaxLength < 0) textBoxProperties.MaxLength = ai_MaxLength;
                //    if (!string.IsNullOrWhiteSpace(as_Mask))
                //    {
                //        textBoxProperties.MaskSettings.Mask = as_Mask;
                //        textBoxProperties.MaskSettings.IncludeLiterals = MaskIncludeLiteralsMode.All;
                //    }
                //    if (ab_IsRequired)
                //    {
                //        textBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                //        textBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                //        textBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                //    }
                //    if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                //    {
                //        textBoxProperties.ValidationSettings.EnableCustomValidation = true;
                //        textBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;
                //    }

                //});
                column.SetDataItemTemplateContent(container =>
                {
                    if (container.VisibleIndex < 0)
                        return;

                    var ls_ParamValue = DataBinder.Eval(container.DataItem, as_ParamField).ToString();
                    helper.DevExpress().Button(buttonSetting =>
                    {
                        buttonSetting.Text = "View";
                        buttonSetting.Name = "btnView" + as_FieldName + container.VisibleIndex;
                        buttonSetting.Width = Unit.Percentage(100);
                        if (!string.IsNullOrWhiteSpace(as_OnClickEvent))
                        {
                            buttonSetting.ClientSideEvents.Click = "function(s,e){ " + as_OnClickEvent + "(" + ls_ParamValue + "); }";
                        }
                    }).Render();
                });


            });

        }


        #region Bank Column Setting
        public MVCxGridViewColumn AddBandNormalColumn(string as_FieldName, string as_Caption, NAPColumnType ao_ColumnType, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "")
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            switch (ao_ColumnType)
            {
                case NAPColumnType.DateTime:
                    column.Width = 120;
                    column.UnboundType = DevExpress.Data.UnboundColumnType.DateTime;
                    column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False;
                    break;
                case NAPColumnType.Integer:
                    column.Width = 80;
                    column.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
                    column.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
                    column.CellStyle.HorizontalAlign = HorizontalAlign.Right;
                    break;
                case NAPColumnType.Date:
                    column.Width = 90;
                    column.ColumnType = MVCxGridViewColumnType.DateEdit;
                    column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                    //column.PropertiesEdit.DisplayFormatString = "yyyyMMdd";
                    break;
                case NAPColumnType.String:
                    column.UnboundType = DevExpress.Data.UnboundColumnType.String;
                    column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
                    column.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
                    break;
            }
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString);

            return column;
        }
        public MVCxGridViewColumn AddBandTextBoxColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", int ai_MaxLength = 0, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_Mask = null)
        {

            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);
            column.EditorProperties().TextBox(textBoxProperties =>
            {
                if (ai_MaxLength > 0) textBoxProperties.MaxLength = ai_MaxLength;
                if (!string.IsNullOrWhiteSpace(as_Mask))
                {
                    textBoxProperties.MaskSettings.Mask = as_Mask;
                    textBoxProperties.MaskSettings.IncludeLiterals = MaskIncludeLiteralsMode.All;
                }
                if (ab_IsRequired)
                {
                    textBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    textBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    textBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    textBoxProperties.ValidationSettings.EnableCustomValidation = true;
                    textBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }

            });
            return column;
        }
        public MVCxGridViewColumn AddBandDateEditorColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", string as_EditFormatString = "", DateTime? adt_MaxDate = null, DateTime? adt_MinDate = null, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_DropDownEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);
            column.ColumnType = MVCxGridViewColumnType.DateEdit;
            column.EditorProperties().DateEdit(dateEditProperties =>
            {
                dateEditProperties.UseMaskBehavior = true;
                if (adt_MinDate != null) dateEditProperties.MinDate = (DateTime)adt_MinDate;
                if (adt_MaxDate != null) dateEditProperties.MaxDate = (DateTime)adt_MaxDate;
                //dateEditProperties.EditFormat = EditFormat.Date;
                dateEditProperties.EditFormatString = as_EditFormatString;
                dateEditProperties.DisplayFormatInEditMode = true;
                dateEditProperties.EditFormat = EditFormat.Custom;
                dateEditProperties.AllowUserInput = true;
                dateEditProperties.AllowNull = true;
                dateEditProperties.DisplayFormatString = as_DisplayFormatString;

                if (ab_IsRequired)
                {
                    dateEditProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    dateEditProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    dateEditProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (as_EditFormatString == Utils.GetFormatString.DateTimeEdit)
                {
                    dateEditProperties.TimeSectionProperties.Visible = true;
                    dateEditProperties.TimeSectionProperties.TimeEditProperties.EditFormat = EditFormat.Custom;
                    dateEditProperties.TimeSectionProperties.ShowHourHand = true;
                    dateEditProperties.TimeSectionProperties.TimeEditProperties.EditFormatString = "HH:mm:ss";
                    dateEditProperties.CalendarProperties.FastNavProperties.EnablePopupAnimation = true;
                    dateEditProperties.ClientSideEvents.DropDown = as_DropDownEvent;
                    dateEditProperties.ClientSideEvents.CloseUp = "function(s,e){if(s.GetValue()==null||yyyy_MM_dd(s.GetValue(),'/')=='100/01/01') {s.GetTimeEdit().SetValue(null);s.SetValue(null);}}";
                    dateEditProperties.ClientSideEvents.ValueChanged = "function(s,e){if(s.GetValue()==null||yyyy_MM_dd(s.GetValue(),'/')=='100/01/01') {s.GetTimeEdit().SetValue(null);s.SetValue(null);}}";
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    dateEditProperties.ValidationSettings.EnableCustomValidation = true;
                    dateEditProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }
            });
            return column;

        }
        public MVCxGridViewColumn AddBandTimeEditorColumn(HtmlHelper helper, string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", string as_EditFormatString = "", bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired);
            column.EditorProperties().TextBox(textBoxProperties =>
            {
                textBoxProperties.MaxLength = 5;

                textBoxProperties.MaskSettings.Mask = "00:00";
                textBoxProperties.MaskSettings.IncludeLiterals = MaskIncludeLiteralsMode.All;
                if (ab_IsRequired)
                {
                    textBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    textBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    textBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    textBoxProperties.ValidationSettings.EnableCustomValidation = true;
                    textBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }
            });
            return column;
        }
        public MVCxGridViewColumn AddBandComboboxColumn(string as_FieldName, string as_Caption, object ao_Model, string as_ValueFieldName, string as_TextFieldName, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_SelectChangedEvent = null, string as_Type = "Int", object ao_CallbackRouteValues = null, string as_BeginCallback = null, string as_EndCallback = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

            column.ColumnType = MVCxGridViewColumnType.ComboBox;
            column.EditorProperties().ComboBox(comboBoxProperties =>
            {
                comboBoxProperties.TextField = as_TextFieldName;
                comboBoxProperties.ValueField = as_ValueFieldName;
                comboBoxProperties.ValueType = as_Type == "Int" ? typeof(int) : typeof(string);
                comboBoxProperties.DataSource = ao_Model;
                if (ao_CallbackRouteValues != null) comboBoxProperties.CallbackRouteValues = ao_CallbackRouteValues;
                if (as_BeginCallback != null) comboBoxProperties.ClientSideEvents.BeginCallback = as_BeginCallback;
                if (as_EndCallback != null) comboBoxProperties.ClientSideEvents.EndCallback = as_EndCallback;
                if (ab_IsRequired)
                {
                    comboBoxProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    comboBoxProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    comboBoxProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    //if (!string.IsNullOrWhiteSpace(as_SelectChangedEvent))
                    //{
                    //    comboBoxProperties.ClientSideEvents.SelectedIndexChanged = as_SelectChangedEvent;
                    //}
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    comboBoxProperties.ValidationSettings.EnableCustomValidation = true;
                    comboBoxProperties.ClientSideEvents.Validation = as_ValidationEvent;

                }
                if (!string.IsNullOrWhiteSpace(as_SelectChangedEvent))
                {
                    comboBoxProperties.ClientSideEvents.SelectedIndexChanged = as_SelectChangedEvent;
                }
                comboBoxProperties.EnableSynchronization = DefaultBoolean.True;
            });
            return column;
        }
        public MVCxGridViewColumn AddBandHyperlinkColumn(string as_FieldName, string as_Caption, string as_urlFormatString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

            column.ColumnType = MVCxGridViewColumnType.HyperLink;
            column.EditorProperties().HyperLink(hyperLinkProperties =>
            {
                hyperLinkProperties.NavigateUrlFormatString = HttpUtility.UrlDecode(as_urlFormatString);
                hyperLinkProperties.TextField = as_FieldName;
                hyperLinkProperties.Target = "_blank";
            });
            return column;
        }
        public MVCxGridViewColumn AddBandMapHyperlinkColumn(HtmlHelper helper, string as_FieldName, string as_Caption, string as_urlFormatString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = null, bool ab_IsRequired = false, string as_ValidationEvent = null, string as_LatFieldName = "", string as_LngFieldName = "")
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired, as_DisplayFormatString: as_DisplayFormatString);
            column.ColumnType = MVCxGridViewColumnType.HyperLink;
            column.SetDataItemTemplateContent(container =>
            {
                if (container.VisibleIndex >= 0)
                {
                    helper.DevExpress().HyperLink(hyperLinkProperties =>
                    {
                        var ls_KeyValue = container.KeyValue;
                        if (DataBinder.Eval(container.DataItem, as_FieldName) != DBNull.Value && DataBinder.Eval(container.DataItem, as_FieldName).ToString() != "")
                            if (as_DisplayFormatString == Utils.GetFormatString.DateTimeDisplay)
                                hyperLinkProperties.Properties.Text = Convert.ToDateTime(DataBinder.Eval(container.DataItem, as_FieldName).ToString()).ToString(Utils.GetFormatString.DateTimeDisplay);
                            else
                                hyperLinkProperties.Properties.Text = DataBinder.Eval(container.DataItem, as_FieldName).ToString();
                        hyperLinkProperties.Name = "lnk_" + as_FieldName + ls_KeyValue + Utils.GenerateRandom(4);
                        hyperLinkProperties.Properties.NavigateUrlFormatString = HttpUtility.UrlDecode(String.Format(as_urlFormatString, DataBinder.Eval(container.DataItem, as_LatFieldName), DataBinder.Eval(container.DataItem, as_LngFieldName)));
                        hyperLinkProperties.Properties.TextField = as_FieldName;
                        hyperLinkProperties.Properties.ClientSideEvents.Click = "function(s,e){window.open('" + hyperLinkProperties.Properties.NavigateUrlFormatString + "', '_blank')}";
                        hyperLinkProperties.Properties.Target = "_blank";
                    }).Render();
                }
                else
                {
                    if (DataBinder.Eval(container.DataItem, as_FieldName) != null)
                        helper.ViewContext.Writer.Write(DataBinder.Eval(container.DataItem, as_FieldName).ToString());
                }
            });
            return column;
        }
        public MVCxGridViewColumn AddBandMemoColumn(string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

            column.ColumnType = MVCxGridViewColumnType.Memo;
            column.EditorProperties().Memo(memoProperties =>
            {
                if (ab_IsRequired)
                {
                    memoProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    memoProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    memoProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    memoProperties.ValidationSettings.EnableCustomValidation = true;
                    memoProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }
            });
            return column;
        }
        public MVCxGridViewColumn AddBandCheckBoxColumn(string as_FieldName, string as_Caption, object ao_ValueChecked, object ao_ValueUnchecked, Type ao_ValueType, string as_ValueCheckedString, string as_ValueUncheckedString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);

            column.ColumnType = MVCxGridViewColumnType.CheckBox;
            var checkBoxProperties = column.PropertiesEdit as CheckBoxProperties;
            checkBoxProperties.ValueChecked = ao_ValueChecked;
            checkBoxProperties.ValueUnchecked = ao_ValueUnchecked;
            checkBoxProperties.ValueType = ao_ValueType;
            checkBoxProperties.ValueCheckedString = as_ValueCheckedString;
            checkBoxProperties.ValueUncheckedString = as_ValueUncheckedString;
            return column;
        }
        public MVCxGridViewColumn AddBandCheckBoxColumnWithinHeader(HtmlHelper helper, string as_FieldName, string as_Caption, object ao_ValueChecked, object ao_ValueUnchecked, Type ao_ValueType, string as_ValueCheckedString, string as_ValueUncheckedString, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, bool ab_IsRequired = false, string as_ValidationEvent = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, ab_IsRequired: ab_IsRequired);
            column.SetHeaderTemplateContent(c =>
            {
                helper.DevExpress().CheckBox(chkSettings =>
                {
                    chkSettings.Text = as_Caption;
                    chkSettings.Name = "chk" + this._Settings.Name + as_FieldName + "_SelectAll";
                    chkSettings.ControlStyle.Font.Underline = false;
                    chkSettings.Width = Unit.Percentage(100);
                    chkSettings.ControlStyle.HorizontalAlign = HorizontalAlign.Center;
                    chkSettings.Properties.ClientSideEvents.CheckedChanged = "function (s,e){ On" + chkSettings.Name + "(s,e);}";
                }).Render();
            });
            column.ColumnType = MVCxGridViewColumnType.CheckBox;
            var checkBoxProperties = column.PropertiesEdit as CheckBoxProperties;
            checkBoxProperties.ValueChecked = ao_ValueChecked;
            checkBoxProperties.ValueUnchecked = ao_ValueUnchecked;
            checkBoxProperties.ValueType = ao_ValueType;
            checkBoxProperties.ValueCheckedString = as_ValueCheckedString;
            checkBoxProperties.ValueUncheckedString = as_ValueUncheckedString;
            column.Settings.AllowSort = DefaultBoolean.False;

            return column;
        }
        public MVCxGridViewColumn AddBandHyperlinkDynamicClientSideColumn(string as_FieldName, string as_Caption, HtmlHelper helper, string[] aa_DataFieldName, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = null, string as_ClientSideEventName = null)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible);
            column.SetDataItemTemplateContent(container =>
            {
                if (container.VisibleIndex < 0)
                    return;

                object[] la_DataValue = new object[aa_DataFieldName.Length];
                bool lb_Valid = true;
                string ls_ValueString = "";
                for (int i = 0; i < aa_DataFieldName.Length; i++)
                {
                    if (!string.IsNullOrWhiteSpace(aa_DataFieldName[i]))
                    {
                        la_DataValue[i] = DataBinder.Eval(container.DataItem, aa_DataFieldName[i]);

                    }
                }
                for (int i = 0; i < la_DataValue.Length; i++)
                {
                    if (la_DataValue[i] == null)
                    {
                        lb_Valid = false;
                    }
                    else
                    {
                        ls_ValueString = ls_ValueString + "'" + (la_DataValue[i] == DBNull.Value ? "" : la_DataValue[i].ToString()) + "',";


                    }
                }

                if (lb_Valid)
                {

                    if (ls_ValueString != "")
                    {

                        ls_ValueString = ls_ValueString.Substring(0, ls_ValueString.Length - 1);
                        if (ls_ValueString != "''")
                        {
                            helper.DevExpress().HyperLink(hyperlink =>
                            {
                                var ls_KeyValue = container.KeyValue;
                                hyperlink.Name = "lnk_" + as_FieldName + ls_KeyValue + Utils.GenerateRandom(4);
                                if (as_DisplayFormatString == Utils.GetFormatString.DateDisplay)
                                    hyperlink.Properties.Text = Convert.ToDateTime(DataBinder.Eval(container.DataItem, as_FieldName).ToString()).ToString(Utils.GetFormatString.DateDisplay);
                                else
                                    hyperlink.Properties.Text = DataBinder.Eval(container.DataItem, as_FieldName).ToString();
                                hyperlink.Properties.TextField = as_FieldName;
                                hyperlink.Properties.ClientSideEvents.Click = "function (s,e){ " + as_ClientSideEventName + "(" + ls_ValueString + ");}";
                                hyperlink.Properties.Target = "_blank";
                            }).Render();
                        }
                        else
                        {
                            helper.ViewContext.Writer.Write("");
                        }
                    }
                }
                else
                {
                    if (DataBinder.Eval(container.DataItem, as_FieldName) != null)
                        helper.ViewContext.Writer.Write(DataBinder.Eval(container.DataItem, as_FieldName).ToString());

                }


            });

            return column;
        }
        public MVCxGridViewColumn AddBandNumberColumn(HtmlHelper helper, string as_FieldName, string as_Caption, int ai_Width = 0, bool ab_Editable = false, bool ab_EditFormSettingsVisible = false, string as_DisplayFormatString = "", SpinEditNumberType ao_NumberType = SpinEditNumberType.Float, float? afl_MinValue = null, float? afl_MaxValue = null, bool ab_IsRequired = false, string as_ValidationEvent = null, DevExpress.Data.SummaryItemType ao_SummaryType = DevExpress.Data.SummaryItemType.None, bool ab_IsRealTimeCalTotalSum = false)
        {
            MVCxGridViewColumn column = new MVCxGridViewColumn();
            this.CommonColumnSetting(column, as_FieldName, as_Caption, ai_Width, ab_Editable, ab_EditFormSettingsVisible, as_DisplayFormatString, ab_IsRequired: ab_IsRequired);

            column.ColumnType = MVCxGridViewColumnType.TextBox;
            column.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
            column.CellStyle.HorizontalAlign = HorizontalAlign.Right;
            column.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
            column.EditorProperties().SpinEdit(spinEditProperties =>
            {
                spinEditProperties.NumberFormat = SpinEditNumberFormat.Custom;
                spinEditProperties.DisplayFormatString = as_DisplayFormatString;
                spinEditProperties.DisplayFormatInEditMode = true;
                spinEditProperties.NumberType = ao_NumberType;

                    //spinEditProperties.AllowNull = false;
                    spinEditProperties.SpinButtons.Visible = false;
                spinEditProperties.SpinButtons.ShowLargeIncrementButtons = false;
                spinEditProperties.SpinButtons.ShowIncrementButtons = false;
                spinEditProperties.Increment = 0;
                spinEditProperties.AllowMouseWheel = false;
                if (afl_MinValue != null) spinEditProperties.MinValue = (decimal)afl_MinValue;
                if (afl_MaxValue != null) spinEditProperties.MaxValue = (decimal)afl_MaxValue;
                if (ab_IsRequired)
                {
                    spinEditProperties.ValidationSettings.RequiredField.IsRequired = ab_IsRequired;
                    spinEditProperties.ValidationSettings.RequiredField.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                    spinEditProperties.ValidationSettings.ErrorText = Utils.GetMessage("1001", "[" + Utils.GenerateJson("1", Utils.GetTranslation(as_Caption), "String") + Utils.GenerateJson("2", " ", "String").Remove(Utils.GenerateJson("2", " ", "String").Length - 1) + "]");
                }
                if (!string.IsNullOrWhiteSpace(as_ValidationEvent))
                {
                    spinEditProperties.ValidationSettings.EnableCustomValidation = true;
                    spinEditProperties.ClientSideEvents.Validation = as_ValidationEvent;
                }
            });
            if (ab_IsRealTimeCalTotalSum)
            {
                ASPxSummaryItem summaryItem = new ASPxSummaryItem(column.FieldName, DevExpress.Data.SummaryItemType.Sum);
                summaryItem.Tag = "SummaryItem_Sum_" + column.FieldName;
                this._Settings.TotalSummary.Add(summaryItem);
                column.SetFooterTemplateContent(c =>
                {

                    helper.DevExpress().Label(lbSettings =>
                    {
                        string fieldName = (c.Column as GridViewDataColumn).FieldName;
                            //c.data
                            lbSettings.Name = "lbl_Sum_" + fieldName;
                        lbSettings.Properties.EnableClientSideAPI = true;
                        ASPxSummaryItem summaryItem1 = c.Grid.TotalSummary.First(i => i.Tag == ("SummaryItem_Sum_" + fieldName));
                        lbSettings.Text = string.Format("{0:" + as_DisplayFormatString + "}", (c.Grid.GetTotalSummaryValue(summaryItem1) ?? 0));

                    }).Render();
                });
            }
            this._Settings.TotalSummary.Add(ao_SummaryType, as_FieldName).DisplayFormat = as_DisplayFormatString;
            return column;
        }
        
        #endregion
    }
}

  

原文地址:https://www.cnblogs.com/hesijian/p/12426907.html