如何在DataGridView单元格单击事件中获取先前选择的单元格

时间:2019-05-14 01:50:35

标签: c# winforms datagridview

我有一个DataGridView,并且只允许选择一列。
为此,我在CellClick事件中检查了所选单元格的ColumnHeader是否匹配,如果不匹配,我将清除选择。
但是,我要使其返回到先前选择的单元格(如果他们在错误的列中选择了一个单元格)。我怎样才能做到这一点?

我尝试存储选定的单元格对象,但是那样行不通,因为CellClick事件触发时,选定的单元格对象将更改。

此外,由于某些原因,每次单击错误的单元格时,我的选择都不起作用,尤其是如果单击速度很快,错误的单元格仍将保持选中状态,为您的信息添加了DataGridView CellClick事件在运行时动态地变化,并且有多个DataGridView控件。

我的代码我无法提供填充DataGridView的方式,因为它确实很长。

  private void Form1_Load(object sender, EventArgs e)
  {
      DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);
  }

  void DGV_CellClick(Object sender, EventArgs e)
  {
      DataGridView dgv = (DataGridView)sender;
      // DataGridViewCell Selectedcell = dgv.SelectedCells[0];
      if (!dgv.Columns[dgv.SelectedCells[0].ColumnIndex].HeaderText.Contains("SCORE"))
          dgv.ClearSelection();
  }

1 个答案:

答案 0 :(得分:0)

由于只启用了一个列,因此可以使用SelectionChanged事件来确定DataGridView.CurrentCell是否属于已启用的列,以及是否未将CurrentCell设置为当前行中启用的列:

int dgvEnabledColumn = 1;

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    var dgv = sender as DataGridView;
    var currentCell = dgv.CurrentCell;
    if (currentCell.ColumnIndex != dgvEnabledColumn )
    {
        dgv.CurrentCell = dgv[dgvEnabledColumn, currentCell.RowIndex];
    }
}

您可以使用列的集合来扩展启用的列的选择(将当前单元格设置为最近/上一个/下一个列)。

例如,使用DataGridViewColumn对象的集合,确定“当前”单元格是否已启用,如果未启用,则将“当前”单元格设置为最近的下一个启用的列(如果有)或最接近的上一个列:

List<DataGridViewColumn> 可以在初始化DataGridView之后填充:

enabledColumns = new List<DataGridViewColumn>()
{
    dataGridView1.Columns[0],
    dataGridView1.Columns[2]
};

List<DataGridViewColumn> enabledColumns = null;

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (enabledColumns is null) return;
    var dgv = sender as DataGridView;
    var currentCell = dgv.CurrentCell;
    if (!enabledColumns.Any(c => c.Index == currentCell.ColumnIndex))
    {
        var nextCol = enabledColumns.FirstOrDefault(c => c.Index > currentCell.ColumnIndex);
        if (nextCol != null) {
            dgv.CurrentCell = dgv[nextCol.Index, currentCell.RowIndex];
        }
        else
        {
            var previousCol = enabledColumns.First(c => c.Index < currentCell.ColumnIndex);
            dgv.CurrentCell = dgv[previousCol.Index, currentCell.RowIndex];
        }
    }
}