您会认为网格中有一个属性可以更改按下回车键时选择的移动方式。不幸的是,DataGridView 没有这个属性。我猜第三方库可能有一个具有此功能的网格。
以下是从@Cody Gray 的回答中获取的可能解决方案。 DataGridView keydown event not working in C#...他的回答涉及尝试连接网格KeyDown 或其他用于“GRID”的“关键”事件时的问题。这意味着当用户在单元格中“编辑”时,这些事件不会触发。在大多数情况下,您应该使用网格EditingControlShowing 事件来捕获单个单元格键事件。这看起来很简单;但是,尚不清楚“何时”应该这样做。
例如,当用户按下回车键时,使用以下任一解决方案都可以通过水平移动而不是垂直移动选择来工作......但是......。这仅适用于用户在按下“Enter”键时“编辑”单元格的情况。如果用户只是“点击”不同的单元格然后按下“Enter”键,选择将向下移动。
我相信您可以在未编辑单元格的情况下使用它。我要问的问题……将“Enter”键变成“Tab”键是否值得?如果您要在正在编辑的单元格之外实现此功能,我相信您在实现此功能后会意识到您刚刚实现的功能已经在“Tab”键中可用。只是想重新发明轮子。
正如 Cody 的回答所暗示的,使用“DataGridView”基本事件来做你所描述的事情并不简单。该解决方案基本上创建了一个继承自DataGridView 并覆盖网格ProcessCmdKey 事件的类。在这里您可以实现所描述的行为,但是,如上所述,只有在编辑单元格时才会发生水平移动。
class MyDataGridView : DataGridView {
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) {
if ((keyData == (Keys.Enter))) {
if (this.CurrentCell.IsInEditMode) {
Point lastPosition = new Point(this.CurrentCell.ColumnIndex, this.CurrentCell.RowIndex);
if (lastPosition.X == this.ColumnCount - 1) {
lastPosition.X = 0;
lastPosition.Y++;
}
else {
lastPosition.X++;
}
this.CurrentCell = this.Rows[lastPosition.Y].Cells[lastPosition.X];
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
@Asaf 在上面同一链接中的回答,提供了一个使用网格基础事件的示例。下面是使用这两种方法的完整示例。将DataGridView 和myDataGridView 拖放到表单上以使代码正常工作。希望这会有所帮助。
DataTable GridTable;
DataTable GridTable2;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
GridTable = GetTable();
FillTable(GridTable);
dataGridView1.DataSource = GridTable;
GridTable2 = GetTable();
FillTable(GridTable2);
myDataGridView1.DataSource = GridTable2;
}
private DataTable GetTable() {
DataTable dt = new DataTable();
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
dt.Columns.Add("Col3", typeof(string));
dt.Columns.Add("Col4", typeof(string));
return dt;
}
private void FillTable(DataTable dt) {
for (int i = 0; i < 15; i++) {
dt.Rows.Add("C1R" + i, "C2R" + i, "C3R" + i, "C4R" + i);
}
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
if (e.Control is DataGridViewTextBoxEditingControl) {
DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl;
tb.PreviewKeyDown -= dataGridView1_PreviewKeyDown;
tb.PreviewKeyDown += dataGridView1_PreviewKeyDown;
}
}
private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
if (e.KeyData == Keys.Enter) {
//if (dataGridView1.CurrentCell.IsInEditMode) {
Point lastPosition = new Point(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex);
if (lastPosition.X == dataGridView1.ColumnCount - 1) {
lastPosition.X = 0;
lastPosition.Y++;
}
else {
lastPosition.X++;
}
dataGridView1.CurrentCell = dataGridView1.Rows[lastPosition.Y].Cells[lastPosition.X];
//}
//else {
// good luck here
//}
}
}