C# 停止C中datagridview的行选择更改#

C# 停止C中datagridview的行选择更改#,c#,datagridview,C#,Datagridview,我正在制作一个程序,我们只需按enter键,就可以通过数据网格视图编辑或插入记录。问题是,每当我在任何单元格中写入值并按enter键时,行选择都会更改为下一行 当我按enter键时,我希望它不会更改选定的行。它应该只是离开单元格编辑或移动到下一个单元格 当刚刚选中行时,我在按enter键时遇到了相同的问题。我通过从行索引中减去一来解决这个问题,但是如何解决单元格问题呢?您可能会认为网格中有一个属性,可以在按下enter键时更改选择的移动方式。不幸的是,DataGridView没有此属性。我猜第三

我正在制作一个程序,我们只需按enter键,就可以通过数据网格视图编辑或插入记录。问题是,每当我在任何单元格中写入值并按enter键时,行选择都会更改为下一行

当我按enter键时,我希望它不会更改选定的行。它应该只是离开单元格编辑或移动到下一个单元格


当刚刚选中行时,我在按enter键时遇到了相同的问题。我通过从行索引中减去一来解决这个问题,但是如何解决单元格问题呢?

您可能会认为网格中有一个属性,可以在按下enter键时更改选择的移动方式。不幸的是,
DataGridView
没有此属性。我猜第三方库可能有一个具有此功能的网格

下面是从@Cody Gray的回答中得出的一个可能的解决方案。。。当试图连接网格
KeyDown
或其他用于“网格”的“关键”事件时,他的回答触及了这个问题。这意味着当用户在单元格中“编辑”时,这些事件不会触发。在大多数情况下,您应该使用grids
EditingControlShowing
事件来捕获单个单元格键事件。这看起来很简单;然而,尚不清楚“何时”应该这样做

例如,当用户按enter键时,使用下面的任一解决方案都将按照所述水平而不是垂直移动选择…但是…。仅当用户在按下“回车”键时“编辑”单元格时,此功能才起作用。如果用户只需“点击”另一个单元格,然后按“回车”键,选择将向下移动

我相信,在单元格未被编辑的情况下,您可以使用此功能。我想问的问题是…把“回车”键变成“制表”键值得吗?如果要在编辑的单元格之外实现此功能,我相信在实现此功能后,您会意识到刚才实现的功能已在“Tab”键中可用。只是一个重新发明轮子的想法

正如Cody的回答所暗示的,使用“DataGridView”基本事件进行描述并不是一件简单的事情。此解决方案基本上创建了一个类,该类继承自
DataGridView
,并覆盖grids
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
    //}
  }
}
DataTable-GridTable;
数据表GridTable2;
公共表格1(){
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e){
GridTable=GetTable();
填充表(网格表);
dataGridView1.DataSource=GridTable;
GridTable2=GetTable();
可填充(网格表2);
myDataGridView1.DataSource=GridTable2;
}
私有数据表GetTable(){
DataTable dt=新的DataTable();
添加(“Col1”,typeof(string));
添加(“Col2”,typeof(string));
添加(“Col3”,typeof(string));
添加(“Col4”,typeof(string));
返回dt;
}
专用空白填充表(数据表dt){
对于(int i=0;i<15;i++){
添加(“C1R”+i,“C2R”+i,“C3R”+i,“C4R”+i”);
}
}
私有void dataGridView1_EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e){
如果(例如,控件是DataGridViewTextBoxedEdit控件){
DataGridViewTextBoxEditingControl tb=e.控件作为DataGridViewTextBoxEditingControl;
tb.PreviewKeyDown-=dataGridView1\u PreviewKeyDown;
tb.PreviewKeyDown+=dataGridView1\u PreviewKeyDown;
}
}
私有void dataGridView1_PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e){
如果(e.KeyData==Keys.Enter){
//if(dataGridView1.CurrentCell.IsInEditMode){
Point lastPosition=新点(dataGridView1.CurrentCell.ColumnIndex、dataGridView1.CurrentCell.RowIndex);
if(lastPosition.X==dataGridView1.ColumnCount-1){
lastPosition.X=0;
lastPosition.Y++;
}
否则{
lastPosition.X++;
}
dataGridView1.CurrentCell=dataGridView1.Rows[lastPosition.Y].Cells[lastPosition.X];
//}
//否则{
//祝你好运
//}
}
}

您是否考虑过按“Tab”键而不是“Enter”键?是的,Tab键工作正常,但我想在编辑单元格时停止Enter键的功能