在Datagridview中按Enter键移动到下一个单元格

本文关键字:下一个 单元格 移动 Datagridview 中按 Enter | 更新日期: 2023-09-27 17:49:43

我有一个DataGridView,每当按ENTER键时,我就从一个单元格移动到另一个单元格。

我已经设法找到解决方案,当单元格在编辑模式,而不是在编辑模式。

我面临的问题是,当用户在最后一行,而他正在编辑一个单元格,然后按ENTER键,一个事件没有触发(selectionChanged),单元格没有离开焦点。它只是从编辑模式退出。这很奇怪,因为它只发生在最后一行。所有其他行都按预期工作。

我使用2个事件,以便在单元格处于编辑模式时按Enter键移动到下一个单元格。

private void dgvTT_SelectionChanged(object sender, EventArgs e)
    {
        if (MouseButtons != 0) return;
        if (_celWasEndEdit != null && dgvTT.CurrentCell != null)
        {
            // if we are currently in the next line of last edit cell
            if (dgvTT.CurrentCell.RowIndex == _celWasEndEdit.RowIndex + 1 &&
                dgvTT.CurrentCell.ColumnIndex == _celWasEndEdit.ColumnIndex)
            {
                int iColNew;
                int iRowNew = 0;
                if (_celWasEndEdit.ColumnIndex >= colMaam.Index)
                {
                    iColNew = colMisparHeshbon.Index;
                    iRowNew = dgvTT.CurrentCell.RowIndex;
                }
                else
                {
                    iColNew = dgvTT.Columns.GetNextColumn(_celWasEndEdit.OwningColumn, DataGridViewElementStates.Displayed, DataGridViewElementStates.None).Index;  
                    iRowNew = _celWasEndEdit.RowIndex;
                }
                dgvTT.CurrentCell = dgvTT[iColNew, iRowNew];
            }
        }
        _celWasEndEdit = null;
    }
    private void dgvTT_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        _celWasEndEdit = dgvTT[e.ColumnIndex, e.RowIndex];
    }

有什么建议吗?

在Datagridview中按Enter键移动到下一个单元格

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                int iColumn = dataGridView1.CurrentCell.ColumnIndex;
                int iRow = dataGridView1.CurrentCell.RowIndex;
                if (iColumn == dataGridView1.Columns.Count - 1)
                    dataGridView1.CurrentCell = dataGridView1[0, iRow + 1];
                else
                    dataGridView1.CurrentCell = dataGridView1[iColumn + 1, iRow];
            }
            } 
            catch { }
        }
        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        { 
            if (e.ColumnIndex == dataGridView1.Columns.Count - 1)
            {
                dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[0];
            }
            else
            {
                SendKeys.Send("{UP}");
                SendKeys.Send("{left}");
            }
        }