/// <summary>
        /// SaveRowValues
        /// </summary>
        /// <param name="row"></param>
        /// <param name="grid"></param>
        public static void SaveRowValues(Xceed.Grid.CellRow row, IArchiveGrid grid)
        {
            if (row is InsertionRow)
            {
                grid.ControlManager.AddNew();

                row.Tag = grid.ControlManager.DisplayManager.CurrentItem;
                grid.AddThrowInsertRow = true;
            }
            else
            {
                grid.ControlManager.EditCurrent();
                // when insert, dataRow endingedit event will occur also
                row.Tag = grid.ControlManager.DisplayManager.CurrentItem;
            }

            try
            {
                foreach (GridColumnInfo info in ADInfoBll.Instance.GetGridColumnInfos(grid.GridName))
                {
                    if (row.Cells[info.GridColumnName] != null && !string.IsNullOrEmpty(info.PropertyName))
                    {
                        if (info.GridColumnType == GridColumnType.Normal)
                        {
                            if (row.Cells[info.GridColumnName].ReadOnly)
                            {
                                continue;
                            }

                            if (info.GridColumnType == GridColumnType.Normal)
                            {
                                EntityScript.SetPropertyValue(grid.ControlManager.DisplayManager.CurrentItem, info.Navigator, info.PropertyName,
                                                              row.Cells[info.GridColumnName].Value);
                            }
                            else if (info.GridColumnType == GridColumnType.ExpressionColumn)
                            {
                                Script.ExecuteStatement(info.Navigator,
                                                        new Dictionary <string, object> {
                                    { "entity", grid.ControlManager.DisplayManager.CurrentItem },
                                    { "cm", grid.ControlManager }
                                });
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionProcess.ProcessWithNotify(ex);
                throw;
            }

            grid.ControlManager.EndEdit(true);

            grid.AddThrowInsertRow = false;

            grid.ArchiveGridHelper.ClearError(row);
        }
        /// <summary>
        /// row_EditEnded
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void row_Saving(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Xceed.Grid.CellRow row = (Xceed.Grid.CellRow)sender;

            SaveRowValues(row, this);

            e.Cancel = (this.ControlManager.State != StateType.View);

            if (e.Cancel)
            {
                this.ControlManager.CancelEdit();
            }
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="dataSource"></param>
        ///// <param name="dataMember"></param>
        //public override void SetDataBinding(object dataSource, string dataMember)
        //{
        //    base.SetDataBinding(dataSource, dataMember);

        //    ArchiveUnboundGrid.SetGridRowCellProperties(this);
        //}

        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void row_Saving(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Xceed.Grid.CellRow row = (Xceed.Grid.CellRow)sender;

            ArchiveUnboundGrid.SaveRowValues(row, row.ParentGrid as ArchiveUnboundDetailGrid);

            e.Cancel = (this.ControlManager.State != StateType.View);

            if (e.Cancel)
            {
                this.ControlManager.CancelEdit();
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="row"></param>
 public static void EndEditRow(Xceed.Grid.CellRow row)
 {
     if (row != null && row.IsBeingEdited)
     {
         try
         {
             row.EndEdit();
         }
         catch (Xceed.Grid.GridValidationException)
         {
             row.CancelEdit();
         }
     }
 }
        ///// <summary>
        ///// CancelEdit
        ///// </summary>
        //private void CancelEdit1()
        //{
        //    for (int i = 0; i < m_grid.DataRows.Count; ++i)
        //    {
        //        if (m_grid.DataRows[i].IsBeingEdited)
        //        {
        //            m_grid.DataRows[i].CancelEdit();
        //        }
        //    }

        //    if (m_insertionRow != null && m_insertionRow.IsBeingEdited)
        //    {
        //        m_insertionRow.CancelEdit();
        //    }

        //    //ClearError();
        //}

        /// <summary>
        /// 清除错误
        /// </summary>
        internal void ClearError(Xceed.Grid.CellRow row)
        {
            foreach (Cell cell in row.Cells)
            {
                cell.ResetErrorDescription();
            }
            row.ResetErrorDescription();

            if (m_insertionRow != null)
            {
                foreach (Cell cell in m_insertionRow.Cells)
                {
                    cell.ResetErrorDescription();
                    cell.ResetReadOnly();
                }
            }
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="dataSource"></param>
        ///// <param name="dataMember"></param>
        //public override void SetDataBinding(object dataSource, string dataMember)
        //{
        //    base.SetDataBinding(dataSource, dataMember);
        //}

        #region "Same"
        /// <summary>
        /// SaveRowValues
        /// </summary>
        /// <param name="row"></param>
        /// <param name="grid"></param>
        public static void SaveRowValues(Xceed.Grid.CellRow row, IArchiveGrid grid)
        {
            if (row is InsertionRow)
            {
                //grid.ControlManager.AddNew();
                grid.ControlManager.State = StateType.Add;

                row.Tag = grid.ControlManager.DisplayManager.CurrentItem;
                grid.AddThrowInsertRow = true;
            }
            else
            {
                grid.ControlManager.EditCurrent();
                // when insert, dataRow endingedit event will occur also
                row.Tag = grid.ControlManager.DisplayManager.CurrentItem;
            }

            grid.ControlManager.EndEdit(true);

            grid.AddThrowInsertRow = false;

            grid.ArchiveGridHelper.ClearError(row);
        }
        internal bool DoValidateRow(Xceed.Grid.CellRow row, System.ComponentModel.CancelEventArgs e)
        {
            bool allValid = true;

            foreach (Cell cell in row.Cells)
            {
                // cell.Visible (when invisible validate also)
                if (cell.Visible && !cell.ReadOnly)
                {
                    allValid &= this.validationProvider1.Validate(cell, false, true);

                    if (!allValid)
                    {
                        return(false);
                    }
                }
            }

            if (ValidateRow != null)
            {
                ValidateRow(row, e);
                allValid &= !e.Cancel;
            }

            //Validator validator = ValidationFactory.CreateValidator(m_cm.DisplayManager.MainDataManager.EntityInfo.EntityType);
            //ValidationResults results = validator.Validate(m_cm.DisplayManager.CurrentItem);
            //if (!results.IsValid)
            //{
            //    foreach (ValidationResult result in results)
            //    {
            //        row.Cells[result.Key].ErrorDescription = result.Message;
            //    }
            //    return false;
            //}

            return(allValid);
        }