web-dev-qa-db-fra.com

Comment déplacer le focus sur la cellule suivante dans un datagridview sur un événement de touche Entrée

Amis, je travaille sur l'application Windows en utilisant C #. J'utilise un datagridview pour afficher des enregistrements. La fonctionnalité dont j'ai besoin est lorsque j'appuie sur la touche "Entrée", le focus doit aller à la cellule suivante (colonne de la même ligne). S'il s'agit de la dernière colonne de la grille, la priorité doit aller à la première colonne de la ligne suivante. J'ai déjà essayé d'utiliser 

    SendKeys.Send("{Tab}")

dans les événements datagridview1_KeyDown et datagridview1_KeyPress. Mais la mise au point se fait en diagonale. S'il vous plaît aidez-moi à résoudre ce problème.

11
Sukanya
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
    int iColumn = dataGridView1.CurrentCell.ColumnIndex;
    int iRow = dataGridView1.CurrentCell.RowIndex;
    if (iColumn == dataGridView1.Columncount-1)
    {
        if (dataGridView1.RowCount > (iRow + 1))
        {
            dataGridView1.CurrentCell = dataGridView1[1, iRow + 1];
        }
        else
        {
            //focus next control
        }
    }
    else
        dataGridView1.CurrentCell = dataGridView1[iColumn + 1, iRow];
}
13
Kishore Kumar
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);
    }
}
10
Arun Agarwal

vous pouvez utiliser l'événement selectionchanged de la datagridview . dans votre formulaire

       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];
    }
6
Amritpal Singh
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;
    }
}
2
YOusaFZai

Même si les codes que j'ai essayés ont déplacé le focus vers la cellule suivante, ils affectaient le clic de la souris lorsque la cellule était en mode édition . C'est ce que j'ai finalement trouvé.

    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}");
        }
    }
0
Rijul Sudhir