#region using System.Windows.Forms; using DevExpress.XtraEditors; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Grid; #endregion namespace CSFrameworkV5.Library.CommonClass { /// /// GridView移动表格单元管理类, 最后版本:2014-12-30 /// public class GridMovetor { /// /// 根据GridView内置有焦点的控件,获取父级GridView /// /// 当前焦点的控件 /// private static GridView GetGridViewByFocusEditor(Control activeControl) { while (activeControl.Parent != null) { if (activeControl.Parent is GridControl) return (GridView)((GridControl)activeControl.Parent) .FocusedView; activeControl = activeControl.Parent; } return null; } /// /// 检查当前控件是否GridView内置有焦点的控件 /// /// 当前焦点的控件 /// public static bool IsGridViewEditorFocus(Control activeControl) { var isEditor = activeControl is TextBoxBase; var view = GetGridViewByFocusEditor(activeControl); return isEditor && view != null; } /// /// 是否最后可编辑的列 /// /// GridView /// 当前焦点的列 /// public static bool IsLastEditableColumn(GridView view, GridColumn focusedColumn) { var idx = view.VisibleColumns.IndexOf(focusedColumn); for (var i = view.VisibleColumns.Count - 1; i >= 0; i--) { var col = view.VisibleColumns[i]; //忽略不可编辑Column if (!col.OptionsColumn.AllowEdit) continue; if (idx != i) return false; //非最后一个可编辑Column return true; } return true; } /// /// 移动到下一个可编辑的列 /// /// /// public static void MoveNextColumn(GridColumn currentCol) { for (var i = currentCol.VisibleIndex + 1; i < currentCol.View.VisibleColumns.Count; i++) { var colTemp = currentCol.View.VisibleColumns[i]; if (colTemp.OptionsColumn.AllowEdit) { currentCol.View.FocusedColumn = colTemp; break; } } } /// /// 移动到下一个可编辑的列, 若是当前行的最后一列,则定位下一行的第一个可编辑栏位. /// /// GridView /// 当前焦点的控件 /// public static void MoveNextColumnOrRow(GridView view, GridColumn currentCol, KeyPressEventArgs e) { //若是当前行的最后一列,则定位下一行的第一个可编辑栏位. if (IsLastEditableColumn(view, currentCol)) { if (view.FocusedRowHandle + 1 < view.RowCount) { view.MoveNext(); view.FocusedColumn = view.VisibleColumns[0]; e.Handled = true; } } else { //在当前行定位下一个可编辑栏位. MoveNextColumn(view.FocusedColumn); e.Handled = true; } } /// /// 处理表格KeyDown事件。 /// 1.按回车或Tab键自动跳到下一个栏位. /// 2.处理在最后一条记录的最后一栏按回车键新增一条记录. /// public static void OnGridViewKeyDown(object sender, KeyEventArgs e) { if (!(e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)) return; if (sender is GridView) { var view = (GridView)sender; var grid = view.GridControl; var isLastCol = IsLastEditableColumn(view, view.FocusedColumn); var isLastRow = view.FocusedRowHandle == view.RowCount - 1; //不是最后可编辑列, 则移至下一列 if (isLastCol == false || isLastRow == false) { MoveNextColumnOrRow(view, view.FocusedColumn, new KeyPressEventArgs((char)Keys.Enter)); e.Handled = true; return; //任务完成,不处理以下任何事务 } //最后一条记录的最后一列,自动添加记录 if (isLastRow && isLastCol && view.OptionsBehavior.Editable) if (view.GridControl.EmbeddedNavigator.Buttons.CustomButtons .Count > 0) { var addButtonIndex = 0; NavigatorButtonBase addButton = view.GridControl.EmbeddedNavigator.Buttons .CustomButtons[addButtonIndex]; view.GridControl.EmbeddedNavigator.Buttons.DoClick( addButton); view.FocusedColumn = view.VisibleColumns[0]; //新增记录后,将焦点移动到第一列 e.Handled = true; } } } } }