繁体   English   中英

停止C#中datagridview的行选择变化

[英]Stop the row selection change of datagridview in C#

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

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

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

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

以下是从@Cody Gray 的回答中获取的可能解决方案。 DataGridView keydown 事件在 C# 中不起作用......他的回答涉及尝试连接网格KeyDown或其他用于“GRID”的“Key”事件时的问题。 这意味着当用户在单元格中“编辑”时,这些事件不会触发。 在大多数情况下,您应该使用网格EditingControlShowing事件来捕获单个单元格键事件。 这看起来很简单; 但是,尚不清楚“何时”应该这样做。

例如,当用户按下回车键时,使用下面的任一解决方案都可以通过水平而不是垂直移动选择来工作......但是......。 这仅适用于用户在按下“Enter”键时“编辑”单元格的情况。 如果用户只是“点击”不同的单元格,然后按下“Enter”键,选择将向下移动。

我相信您可以在未编辑单元格的情况下使用它。 我要问的问题……将“Enter”键变成“Tab”键是否值得? 如果您要在正在编辑的单元格之外实现此功能,我相信您在实现此功能后会意识到您刚刚实现的功能已经在“Tab”键中可用。 只是想重新发明轮子。

正如 Cody 的回答所暗示的那样,使用“DataGridView”基本事件来做你所描述的事情并不简单。 该解决方案基本上创建了一个 Class,它继承自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
    //}
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM