#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;
}
}
}
}
}