【问题标题】:Stop the row selection change of datagridview in C#在C#中停止datagridview的行选择更改
【发布时间】:2019-09-24 17:50:04
【问题描述】:

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

当我按下回车键时,我希望它不改变选定的行。它应该刚刚退出单元格编辑或移动到下一个单元格。

刚选择该行时,我在输入时遇到了同样的问题。我通过从行索引中减去一个来解决它,但是如何解决单元格问题?

【问题讨论】:

  • 您是否考虑过按“Tab”键而不是“Enter”键?
  • yes tab 键效果很好,但我想在单元格编辑时停止输入键的功能

标签: c# datagridview


【解决方案1】:

您会认为网格中有一个属性可以更改按下回车键时选择的移动方式。不幸的是,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 在上面同一链接中的回答,提供了一个使用网格基础事件的示例。下面是使用这两种方法的完整示例。将DataGridViewmyDataGridView 拖放到表单上以使代码正常工作。希望这会有所帮助。

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
    //}
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多