问题的提出
经常使用的datagridview控件,当你利用它来输入数据时,如果你按下Enter 时,系统默认的是将输入焦点移动至当前列的下一行,但按中国人日常的习惯,我们希望它从左到右进行输入,怎么办呢?
这里我们就要修改系统的两个默认键盘时间,以实现我们自如的控制datagridview埪件对回车Press事件的处理方式,具体怎么操作呢?
新建一用户控件-该用户埪件继承于datagridview,在该埪件的代码中重写ProcessDialogKey, ProcessDataGridViewKey两个事件,让将该用户控件添加到你的项目中就可以应用了。
public class dgv : DataGridView
{ protected override bool ProcessDialogKey(Keys keyData)
{ Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
{ return this.ProcessRightKey(keyData);
}
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{ if (e.KeyCode == Keys.Enter)
{ return this.ProcessRightKey(e.KeyData); }
return base.ProcessDataGridViewKey(e); }
public new bool ProcessRightKey(Keys keyData)
{ Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter) {
// for new row use
//如果dgv中输入焦点在最后一行最后一列则新增行,并将输入交代那移到新增行,首列 if ((base.CurrentCell.ColumnIndex == (base.ColumnCount - 1)) && (base.CurrentCell.RowIndex == (base.RowCount - 1)))
{ ((BindingSource)base.DataSource).AddNew(); base.CurrentCell = base.Rows[base.RowCount - 1].Cells[0];
return true; }
if ((base.CurrentCell.ColumnIndex == (base.ColumnCount - 1)) && (base.CurrentCell.RowIndex + 1 != base.NewRowIndex))
{ base.CurrentCell = base.Rows[base.CurrentCell.RowIndex + 1].Cells[0]; return true; }
return base.ProcessRightKey(keyData); }
return base.ProcessRightKey(keyData); }
}