C# 如何在Enter键按下事件时将焦点移到datagridview中的下一个单元格上

C# 如何在Enter键按下事件时将焦点移到datagridview中的下一个单元格上,c#,winforms,datagridview,C#,Winforms,Datagridview,朋友们,我正在使用C#开发windows应用程序。我正在使用datagridview显示记录。我需要的功能是,当我按下“回车”键时,焦点应该转到下一个单元格(同一行的列)。如果它是网格中的最后一列,那么焦点应该转到下一行的第一列。我已经试过使用 SendKeys.Send("{Tab}") 在datagridview1_KeyDown和datagridview1_KeyPress事件中。但焦点是沿着对角线向下移动的。请帮我解决这个问题。您可以使用datagridview的selecti

朋友们,我正在使用C#开发windows应用程序。我正在使用datagridview显示记录。我需要的功能是,当我按下“回车”键时,焦点应该转到下一个单元格(同一行的列)。如果它是网格中的最后一列,那么焦点应该转到下一行的第一列。我已经试过使用

    SendKeys.Send("{Tab}")

在datagridview1_KeyDown和datagridview1_KeyPress事件中。但焦点是沿着对角线向下移动的。请帮我解决这个问题。

您可以使用datagridview的selectionchanged事件。 以你的形式

       private DataGridViewCell _celWasEndEdit;

        private void datagridview_SelectionChanged(object sender, EventArgs e)
    {

        if (MouseButtons != 0) return;

        if (_celWasEndEdit != null && datagridview.CurrentCell != null)
        {
            // if we are currently in the next line of last edit cell
            if (datagridview.CurrentCell.RowIndex == _celWasEndEdit.RowIndex + 1 &&
                datagridview.CurrentCell.ColumnIndex == _celWasEndEdit.ColumnIndex)
            {
                int iColNew;
                int iRowNew = 0;
                if (_celWasEndEdit.ColumnIndex >= datagridview.ColumnCount - 1)
                {
                    iColNew = 0;
                    iRowNew = dgvItems.CurrentCell.RowIndex;                   
                }
                else
                {
                        iColNew = _celWasEndEdit.ColumnIndex + 1;
                        iRowNew = _celWasEndEdit.RowIndex;
                }
                datagridview.CurrentCell = datagridview[iColNew, iRowNew];
            }
        }
        _celWasEndEdit = null;
      }

    private void datagridview_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        _celWasEndEdit = dgvItems[e.ColumnIndex, e.RowIndex];
    }

尽管我尝试的代码将焦点移到了下一个单元格,但当单元格处于编辑模式时,它们会影响鼠标单击。 这就是我最后想到的

    bool _dgv_list_cellEndEdit = false; // class level variable

    void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            e.SuppressKeyPress=true;
            SendKeys.Send("{Tab}");
        }
    }

    void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        _dgv_list_cellEndEdit=true;
    }

    void dataGridView1_MouseDown(object sender, MouseEventArgs e)
    {
        _dgv_list_cellEndEdit=false;
    }

    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if(_dgv_list_cellEndEdit)
        {
            _dgv_list_cellEndEdit=false;
            SendKeys.Send("{Up}");
            SendKeys.Send("{Tab}");
        }
    }

它只是一个变量,用于跟踪正在编辑的单元格Private DataGridViewCell\u celWasEndEdit;我写了上面的解决方案,没有编辑,我想水平地将焦点从一个单元格移动到下一个单元格。我该怎么做?我已经用了很多次了,我重新检查了我们能做什么“鼠标按钮”,很好的关键字。它工作正常,但不是100%。第一次填充网格时,我选择第一个单元格。然后按“回车”,现在焦点转到第二行(尽管我有4列)。而且在到达最后一个单元格(最后一行,最后一列)后,它给出的错误是“索引超出范围”。.Ya。。我知道。。当时我很着急。所以我没有完成。。你也可以在到达最后一行时编写代码,然后如果你需要创建新行,你可以创建新行。我在第一天就接受了你的答案。你的两种解决方案都帮助我解决了我的问题。所以第二天我也接受了Amrit的答案。我不能接受多个答案吗?当UI上有文本框时,它也会执行,在datagridview旁边,当您在文本框上按Enter键时。
bool notlastColumn =true; //class level variable--- to check either last column is reached or not

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.ColumnCount - 1 == e.ColumnIndex)  //if last column
    {
        KeyEventArgs forKeyDown = new KeyEventArgs(Keys.Enter);
        notlastColumn = false;
        dataGridView1_KeyDown(dataGridView1, forKeyDown);
    }
    else
    {
        SendKeys.Send("{up}");
        SendKeys.Send("{right}");
    }
}

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter && notlastColumn) //if not last column move to nex
    {
        SendKeys.Send("{up}");
        SendKeys.Send("{right}");
    }
    else if (e.KeyCode == Keys.Enter)
    {
        SendKeys.Send("{home}");//go to first column
        notlastColumn = true;
    }
}
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    int icolumn = dataGridView1.CurrentCell.ColumnIndex;
    int irow = dataGridView1.CurrentCell.RowIndex;

    if (keyData == Keys.Enter)
    {                                
        if (icolumn == dataGridView1.Columns.Count - 1)
        {
            dataGridView1.Rows.Add();
            dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
        }
        else
        {
            dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow];
        }
        return true;
    }
    else
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
    bool _dgv_list_cellEndEdit = false; // class level variable

    void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            e.SuppressKeyPress=true;
            SendKeys.Send("{Tab}");
        }
    }

    void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        _dgv_list_cellEndEdit=true;
    }

    void dataGridView1_MouseDown(object sender, MouseEventArgs e)
    {
        _dgv_list_cellEndEdit=false;
    }

    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if(_dgv_list_cellEndEdit)
        {
            _dgv_list_cellEndEdit=false;
            SendKeys.Send("{Up}");
            SendKeys.Send("{Tab}");
        }
    }