user1264708
user1264708

Reputation: 113

DataGridView-when I press enter it goes to the next cell

i have a datagridview with 5 columns,when i press "enter" it goes to the next cell and when it arrives to the end of the rows when i press enter it adds a new rows,but my problem is when i move to the previous rows after i press enter it jumps the rows and does not go to the next cells,any help?

public partial class Form1 : Form
{
    public static int Col;
    public static int Row;

    public Form1()
    {
        InitializeComponent();
    }       

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AllowUserToAddRows = false;
        dataGridView1.Rows.Add();           
    }   

    private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    {           
        Col = dataGridView1.CurrentCellAddress.X;        
        Row = dataGridView1.CurrentCellAddress.Y;     
    }

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {            
        if (e.KeyChar == (int)Keys.Enter)
        {              
            if (Col + 1 < 5)
            {
                dataGridView1.CurrentCell = dataGridView1[Col + 1, Row];
            }
            else
            {                        
                dataGridView1.Rows.Add();
                dataGridView1.CurrentCell = dataGridView1[Col - 4, Row + 1];
            }
        }
    }
}

Upvotes: 11

Views: 35575

Answers (8)

Waheed Alzekry
Waheed Alzekry

Reputation: 19

This code worked well for me

 bool notlastColumn = true;

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        int icolumn = dgvReceDet.CurrentCell.ColumnIndex;
        int irow = dgvReceDet.CurrentCell.RowIndex;
        int i = irow;
        if (keyData == Keys.Enter)
        {
            if (icolumn == dgvReceDet.Columns.Count - 1)
            {
                //dataGridView1.Rows.Add();
                if (notlastColumn == true)
                {
                    dgvReceDet.CurrentCell = dgvReceDet.Rows[i].Cells[0];
                }
                dgvReceDet.CurrentCell = dgvReceDet[0, irow + 1];
            }
            else
            {
                // to pass hidden cell, because will fire exception
                //exception: Current cell cannot be set to an invisible cell
                // the do while loop will enable you to pass any hidden cell
                do
                {
                    icolumn++;
                }
                while (icolumn <= dgvReceDet.Columns.Count - 1 && !dgvReceDet[icolumn, irow].Visible);
                if (icolumn <= dgvReceDet.Columns.Count - 1)
                {
                    dgvReceDet.CurrentCell = dgvReceDet[icolumn, irow];
                }
                else
                {
                    SendKeys.Send("{DOWN}");
                    SendKeys.Send("{HOME}");
                }

            }
            return true;
        }
        else
            if (keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
        //below is for escape key return
        return base.ProcessCmdKey(ref msg, keyData);
    }

Upvotes: 0

Luca
Luca

Reputation: 1

Just move to right when key press is enter...

private void datagridview_KeyDown(object sender, KeyEventArgs e)        
{   
     if (e.KeyCode == Keys.Enter)
     {
          SendKeys.Send("{Right}");
     }
}

Upvotes: 0

Hisham
Hisham

Reputation: 1316

because the keyDown envent will not fire when press enter on datagridview cell this will be best thanks to @Nagarjun

bool 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;
int i = irow;
if (keyData == Keys.Enter)
{
    if (icolumn == dataGridView1.Columns.Count - 1)
    {
         //dataGridView1.Rows.Add();
        if (notlastColumn == true)
        {
            dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
        }
        dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
     }
    else
    {
        // to pass hidden cell, because will fire exception
        //exception: Current cell cannot be set to an invisible cell
        // the do while loop will enable you to pass any hidden cell
         do
          {
            icolumn++;
          } while (!dgv[icolumn, irow].Visible);
        dataGridView1.CurrentCell = dataGridView1[icolumn, irow];
    }
    return true;
}
else
    if (keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
//below is for escape key return
return base.ProcessCmdKey(ref msg, keyData);

}

Upvotes: 1

HaM
HaM

Reputation: 41

this works for me

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {                
            e.SuppressKeyPress = true;
            int row = dataGridView1.CurrentRow.Index;
            int col = dataGridView1.CurrentCell.ColumnIndex;
        }
    }

Upvotes: 4

Nagarjun G N
Nagarjun G N

Reputation: 39

Try using this:

bool 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;
    int i = irow;
    if (keyData == Keys.Enter)
    {
        if (icolumn == dataGridView1.Columns.Count - 1)
        {
             //dataGridView1.Rows.Add();
            if (notlastColumn == true)
            {
                dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
            }
            dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
         }
        else
        {
            dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow];
        }
        return true;
    }
    else
        if (keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
    //below is for escape key return
    return base.ProcessCmdKey(ref msg, keyData);
    //below is for enter key return 
    return base.ProcessCmdKey(ref msg, keyData);     
}

Just copy and paste the code.

Only thing you should have grid in your form.

Upvotes: 2

Novin.Kh
Novin.Kh

Reputation: 129

Using this solution:

private void Form1_Load(object sender, EventArgs e)
    {
        dtg.AllowUserToAddRows = false;
    }
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        int iCol = dtg.CurrentCell.ColumnIndex;
        int iRow = dtg.CurrentCell.RowIndex;

        if (keyData == Keys.Enter)
        {
            if (iCol == dtg.ColumnCount - 1)
            {
                if (iRow + 1 == dtg.RowCount)
                {
                    dtg.Rows.Add();
                }

                dtg.CurrentCell = dtg[0, iRow + 1];
            }
            else
            {
                dtg.CurrentCell = dtg[iCol + 1, iRow];
            }
            return true;
        }
        else if (keyData == Keys.Escape)
        {
            Close();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

Good Luck ...

Upvotes: 0

Steven Borges
Steven Borges

Reputation: 411

What you can do is handle the KeyDown event to check if the return key is pressed, you cancel the event and tell the application to use the selected index of +1 in your datagridview:

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyData == Keys.Enter)
   {
      int column = dataGridView1.CurrentCell.ColumnIndex;
      int row = dataGridView1.CurrentCell.RowIndex;
      dataGridView1.CurrentCell = dataGridView1[column, row+1];
      e.Handled=true;
   }
}

To prevent problems you should also insert a clause to check if there are items available after the one the user pressed return.

Upvotes: 0

Reinaldo
Reinaldo

Reputation: 4676

Forget about CellEnter event and the Form1_KeyPress event also. Just handle the dataGridView1_KeyDown event like this:

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            int col = dataGridView1.CurrentCell.ColumnIndex;
            int row = dataGridView1.CurrentCell.RowIndex;

            if (col < dataGridView1.ColumnCount - 1)
            {
                col ++;
            }
            else
            {
                col = 0;
                row++;
            }

            if (row == dataGridView1.RowCount)
                dataGridView1.Rows.Add();

            dataGridView1.CurrentCell = dataGridView1[col, row];
            e.Handled = true;
        }
    }

Please note that I changed the code a bit, and remember to set the Handled event property to true, otherwise it will process the default behavior.

Cheers!

Upvotes: 16

Related Questions