none
Posicionar selector de Datagridview en celda adyacente RRS feed

  • Pregunta

  • Hola,

    He hecho un facturador que me funciona pero le estoy cambiando el formato.

    Ahora en el nuevo formato, tengo el problema que cuando entro los datos por primera vez, va cambiando de celda adyacente automáticamente, como debe de ser, PERO al devolverme a una celda una o varias celdas arriba para MODIFICAR los datos de la celda, cuando le presiono ENTER, lo lógico es que se vaya a la celda contigua, la adyacente, pero en lugar de hacer eso,  -QUE DEBERIA DE HACERLO - , se me va el selector a la celda de abajo.

    Necesito que al modificar también se vaya a la celda adyacente.

    Aqui el código:

                            

    private void Form1_Load(object sender, EventArgs e)
            {

                dataGridView1.RowCount = 1;

            }

                 

    private void dataGridView1_KeyUp(object sender, KeyEvent

    Args e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (columna == 2)
                    {
                        dataGridView1.Rows.Add();
                        dataGridView1.CurrentCell = dataGridView1.Rows[fila + 1].Cells[0];
                    }


                    dataGridView1.CurrentCell = dataGridView1.Rows[fila].Cells[columna +1];
                    dataGridView1.BeginEdit(true);
                }
            }

            private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
            {
                fila = e.RowIndex;
                columna = e.ColumnIndex;
            }

    Por el momento, para probar es un grid con tres columnas.

    Si alguien puede ayudarme se los agradezco

    miércoles, 17 de enero de 2018 5:35

Respuestas

  • Hola, después de investigar un poco, para que no pase eso cuando terminas de editar, se debería controlar la tecla enter de la celda...y cuando se apriete enter, en lugar de cambiarse de foco hacia abajo, terminar la edición de esa celda(endedit) y luego hacer el código que cambia de foco a la celda adyacente. La forma de solucionar este problema interesante, o al menos la fuente de donde lo saqué para adaptarlo, es hacer un datagridview nuevo que herede del DataGridView, pero sobreescribiendo el comportamiento que haga cuando se aprieta la tecla enter:

    public class NewDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EndEdit();
                int col = this.CurrentCell.ColumnIndex;
                int row = this.CurrentCell.RowIndex;
                if ((col + 1) < this.ColumnCount)
                {
                    col++;
                }
                else
                {
                    row++;
                    if (row == this.RowCount)
                        this.Rows.Add();
                    col = 0;
                }
                this.CurrentCell = this[col, row];
                this.BeginEdit(true);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    }

    Esto de abajo es un añadido a esa clase, que siempre te permite estar en modo edición y tener mas control del contenido de tu celda, distinto es a lo de arriba, que reemplaza el contenido directamente:

    public class NewDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EndEdit();
                int col = this.CurrentCell.ColumnIndex;
                int row = this.CurrentCell.RowIndex;
                if ((col + 1) < this.ColumnCount)
                {
                    col++;
                }
                else
                {
                    row++;
                    if (row == this.RowCount)
                        this.Rows.Add();
                    col = 0;
                }
                this.CurrentCell = this[col, row];
                this.BeginEdit(true);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    
        protected override void OnCellEnter(DataGridViewCellEventArgs e)
        {
            this.BeginEdit(true);
            base.OnCellEnter(e);
        }
    }

    Ahí tu ves cuál se adecúa mejor a lo que quieres



    miércoles, 17 de enero de 2018 16:27
  • puedes poner mas información del error? adjuntar alguna foto/screenshot siempre sirve.

    Para agregar ese código, es una clase más, asique puedes agregar una clase a tu proyecto, y a esa clase le pones de nombre NewDataGridView y ahí empiezas a escribir el código de arriba.Luego en el diseñador te aparecerá el newdatagridview para arrastrarlo a tu formulario y empezar a usarlo.

    Cualquier cosa avisanos
    • Marcado como respuesta rodolopa domingo, 21 de enero de 2018 22:52
    viernes, 19 de enero de 2018 22:52

Todas las respuestas

  • Hola, después de investigar un poco, para que no pase eso cuando terminas de editar, se debería controlar la tecla enter de la celda...y cuando se apriete enter, en lugar de cambiarse de foco hacia abajo, terminar la edición de esa celda(endedit) y luego hacer el código que cambia de foco a la celda adyacente. La forma de solucionar este problema interesante, o al menos la fuente de donde lo saqué para adaptarlo, es hacer un datagridview nuevo que herede del DataGridView, pero sobreescribiendo el comportamiento que haga cuando se aprieta la tecla enter:

    public class NewDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EndEdit();
                int col = this.CurrentCell.ColumnIndex;
                int row = this.CurrentCell.RowIndex;
                if ((col + 1) < this.ColumnCount)
                {
                    col++;
                }
                else
                {
                    row++;
                    if (row == this.RowCount)
                        this.Rows.Add();
                    col = 0;
                }
                this.CurrentCell = this[col, row];
                this.BeginEdit(true);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    }

    Esto de abajo es un añadido a esa clase, que siempre te permite estar en modo edición y tener mas control del contenido de tu celda, distinto es a lo de arriba, que reemplaza el contenido directamente:

    public class NewDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EndEdit();
                int col = this.CurrentCell.ColumnIndex;
                int row = this.CurrentCell.RowIndex;
                if ((col + 1) < this.ColumnCount)
                {
                    col++;
                }
                else
                {
                    row++;
                    if (row == this.RowCount)
                        this.Rows.Add();
                    col = 0;
                }
                this.CurrentCell = this[col, row];
                this.BeginEdit(true);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    
        protected override void OnCellEnter(DataGridViewCellEventArgs e)
        {
            this.BeginEdit(true);
            base.OnCellEnter(e);
        }
    }

    Ahí tu ves cuál se adecúa mejor a lo que quieres



    miércoles, 17 de enero de 2018 16:27
  • Gracias por responder Nicolas

    Como se pone ese codigo en el formulario ?

    Porque lo pongo en Form1 y me da un monton de errores.

    Creo un proyecto vacio y es igual. Tengo que añadir un Form y es Form1 y me da errores.

    Me puedes ayudar?

    De antemano Gracias.

    viernes, 19 de enero de 2018 15:36
  • puedes poner mas información del error? adjuntar alguna foto/screenshot siempre sirve.

    Para agregar ese código, es una clase más, asique puedes agregar una clase a tu proyecto, y a esa clase le pones de nombre NewDataGridView y ahí empiezas a escribir el código de arriba.Luego en el diseñador te aparecerá el newdatagridview para arrastrarlo a tu formulario y empezar a usarlo.

    Cualquier cosa avisanos
    • Marcado como respuesta rodolopa domingo, 21 de enero de 2018 22:52
    viernes, 19 de enero de 2018 22:52
  • Ok todo está muy bien Nicolas, Te agradezco mucho la ayuda.

    Me funcionó perfecto

    Voy a dar por cerrado el tema

    Gracias

    domingo, 21 de enero de 2018 22:52