Buscar en este blog

Tuesday, August 24, 2010

Conocer si se han modificado columnas de una fila de un dataset


Soy un newbie en el uso de dataset tipados (Strongly Typed Datasets), me adentré en el mundo del .Net con el Entity Framework 1.0 de la mano. Sin embargo, sabía que tarde o temprano tendría que hacer uso de este tipo de datasets, y esta oportunidad surgió cuando se me pidió que desarrollara una pequeña aplicación de base de datos para Smart Devices. En mi proceso de aprendizaje, descubrí que muchas cosas que consideraba obvias no lo eran y cometí por lo tanto errores cuya solución me tomó más tiempo del que inicialmente había estimado. Y a fin de no olvidar lo que aprendí y para que los demás no cometan los errores que yo cometí, aquí les dejo en este blog lo que descubrí y aprendí en mi intricado camino (si parece un verso lo sé) ;).


Como ya mencioné antes, estoy desarrollando una pequeña aplicación para Smart Devices, concretamente para Windows Mobile. Y una de las funcionalidades que deseaba implementar era la de informar al usuario si existían cambios en los datos pendientes de ser guardados antes de que éste cerrara la forma.

Me di cuenta de que existía el método hasChanges() que hereda mi Dataset de la clase System.Data.DataSet,y pensé, ¿por qué no probamos con este?


El primer intento de mi 'brillante' método lucía así:

private Boolean DbIsDirty() { return MiDataSet.HasChanges(); }


Sí, ya sé que parece muy minimalista, y a mí me parecía además que funcionaría. Sin embargo, el método siempre me devolvía falso a pesar de que modificara todas las columnas de la fila actual.

Después de (como dicen por mi tierra) talachear un poco (y sorprenderme que en Stackoverflow no logré atinar con el post que hablase al respecto, al menos de manera concreta) me di cuenta de que antes de llamar a hasChanges() tenía que forzar que los cambios hechos en los TextBox (esto aplica para otros tipos de controles de edición) se aplicaran a mi DataSet. 

Aprendí una cosa con los DataSets, y es que la fila (row) que nos muestran los controles (como el DataGrid o un TextBox) son objetos de tipo DataRowView. No me quiero meter mucho a explicar que es un DataRowView, lo que si está claro es que si queremos conocer el estado de una fila esta clase nos permite hacerlo.

Modificando el código:

private Boolean DbIsDirty() { // Obtenemos la fila o registro actual del BindingSource al que está ligado nuestro dataset DataRowView currentview = (DataRowView)this.MiBindingSource.Current; // La fila actual en el DataRowView DataRow currentdr = currentview.Row; //Si queremos que los cambios se apliquen a la tabla o datasource subyacente entonces:    currentview.EndEdit(); // Después de llamar a EndEdit el dataset debe de tener los cambios reflejados return midataset.HasChanges()   }


Et voilà!, la clave está en hacer el llamado currentview.EndEdit() ya que este método nos permite confirmar los cambios que se hayan hecho en la fila.