0:00 0 0
Error en la operación porque el programa no pudo realizar o anular un cambio de valor de celda

Error en la operación porque el programa no pudo realizar o anular un cambio de valor de celda

  DrUalcman |  noviembre 252019

El mensaje de Error en la operación porque el programa no pudo realizar o anular un cambio de valor de celda nos ocurre cuando estamos intentando agregar mediante código una nueva fila a un DataGridView de WindowsForm que ya está enlazado a un origen de datos. He visto muchos métodos para solucionar este problema, y algunos de ellos funcionan cuando quieren, otros generan otro tipo de errores. El caso es que la mayoría de ellos hacen que debas de escribir mucho código.

Yo no es que me caracterice por ser vago, pero si puedo ahorrar un par de líneas de código, y es eficiente, pues mucho mejor. Otras veces prefiero escribir más líneas de código y entender bien que es lo que estoy haciendo, que complicar el código y ahorrar líneas o caracteres con abreviaciones en código que no hacen más que dificultar la lectura y mantenimiento a más adelante, sobre todo si hay más personas involucradas en el proyecto.

Mi solución

Al final encontré la solución de mi propia cosecha. Estuve pensando: si el DataGridView es capaz de generar una nueva dila cuando el usuario comienza a escribir en la última fila, ¿porque no se va a poder hacer eso desde el código? Y así es como finalmente comencé a buscar mi propia solución.

Yo lo que quería, en este caso, es que al presionar la tecla INSERTAR del teclado, me generase una nueva fila y me preguntara si quería copiar los datos básicos de la fila anterior. Esto ya no lo voy a poner en el ejemplo, pero lo comento ya que es el porqué necesitaba insertar una nueva fila. El caso es que conseguí hacerlo siguiendo mi idea de capturar la tecla presionada por el usuario.

  1. El usuario presiona INSERTAR al final del DataGridView
  2. Capturamos el evento y enviamos un comando adicional con SendKeys para simular que el usuario ha presionado una tecla
  3. Se dispara el evento UserAddedRow y realizamos las acciones que necesitemos.

El código

//capture the key press on the form
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (MyDataGrid.Focused && keyData == Keys.Insert)
{
int row = MyDataGrid.CurrentRow.Index;
int myRows = MyDataGrid.Rows.Count - 1; //control the insert is on the last row of the grid
if (row == myRows)
{
this.insert = true;
switch (MyDataGrid.CurrentCell.OwningColumn.Name.ToLower())
{
case "NumericColumn": //here control is the column where the user press INSERT required a number
SendKeys.Send("0");
break;
default: //if not can insert a space
SendKeys.Send(" ");
break;
}
}
else this.insert = false;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Yo he utilizado, como ya he dicho, capturar la tecla presionada, pero puedes poner este código en un botón y hacer que se ejecute sobre el DataGridView enviándole previamente el foco y posicionando el cursos en la última fila.

Un poco más optimizado

Por último, para que quede un poco mejor todo, hacemos que la celda sobre la que quiero que se comience a escribir tenga el foco y esté lista para editar. Esto lo conseguimos un poco más de código y un truco que encontré en los foros de Microsoft. El truco consiste en crear el evento CelDoubleClick e invocar este evento una vez que agregamos la fila, por lo que dentro del evento UserAddedRow podemos hacer algo como esto:

        private void MyDataGrid_UserAddedRow(object sender, DataGridViewRowEventArgs e)
{
this.add = true;

((DataGridView)sender).CurrentCell = ((DataGridView)sender).Rows[myRow].Cells["postcode"];
((DataGridView)sender).BeginEdit(true);
lstDefaultCourierPostcode_CellDoubleClick(sender, new DataGridViewCellEventArgs(((DataGridView)sender).Rows[myRow].Cells["postcode"].ColumnIndex, ((DataGridView)sender).Rows[myRow].Cells["postcode"].RowIndex));

}

private void MyDataGrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{

}

Y eso es todo amigos!!!

Happy coding

0 Comentarios

 
 
 

Archivo