DataColumn Expression: Obtiene o establece la expresión utilizada para filtrar filas, calcular los valores de una columna o crear una columna agregada.
Cuando vamos a cargar datos a un DataGrid o almacenar estos datos en otra estructura para hacer algún tipo de proceso, generalmente creamos una estructura DataTable, para reflejar esos datos en pantalla con el tipo de dato que nosotros le indiquemos.
Para estos casos es que podríamos definir una columna que automáticamente tome el valor de algún cálculo en específico, y en realidad puede aceptar cualquier tipo de fórmula que nos retorne un valor válido.
Para el ejemplo que vamos a mostrar en esta ocasión vamos a crear un DataTable con 3 columnas que son cargadas ya sea desde el sistema o manualmente desde el DataGrid, también podría cargarse desde alguna consulta a alguna base de datos.
Aparte de estas 3 columnas que mencionamos arriba vamos a definirle dos más, una de tipo Boolean, otra de tipo String y que en sus expresiones dependiendo del valor de la 3ra columna del DataTable muestre True / False respectivamente.
Algo muy importante a destacar es que estas dos columnas de valores por expresión no se pueden modificar manualmente, ya que estan definidas automáticamente ReadOnly y solo se modifican por la expresión que le indiquemos.
Creamos la estructura del DataTable
VB
Private Sub CreateDataTable() Try dt.Columns.Add("Codigo", GetType(System.String)) dt.Columns.Add("Descripcion", GetType(System.String)) dt.Columns.Add("Valor", GetType(System.Int32)) dt.Columns.Add("EsPositivo", GetType(System.Boolean), "IIF((Valor >= 0),True,False)") dt.Columns.Add("Tipo", GetType(System.String), "IIF((Valor >= 0),'Positivo','Negativo')") Catch ex As Exception Throw ex End Try End Sub
C#
private void CreateDataTable() { try { dt.Columns.Add("Codigo", typeof(string)); dt.Columns.Add("Descripcion", typeof(string)); dt.Columns.Add("Valor", typeof(int)); dt.Columns.Add("EsPositivo", typeof(bool), "IIF((Valor >= 0),True,False)"); dt.Columns.Add("Tipo", typeof(string), "IIF((Valor >= 0),\'Positivo\',\'Negativo\')"); } catch (Exception ex) { throw ex; } }
Como vemos ahí, le estamos creando todas las columnas al DataTable, pero también podríamos solo agregarle las dos columnas «expression» en el caso de que ya tengamos un DataTable cargado con los datos.
Las dos columnas especiales que estamos trabajando como vemos en el procedimiento CreateDataTable una es de tipo Boolean nombrada «EsPositivo» donde la expresión que utilizamos es IIF pero bien podrías utilizar un If normal o alguna otra fórmula de cálculo, entonces «IIF((Valor >= 0),True,False)» nos va a retornar True cuando el valor de la columna «Valor» es 0 o mayor a 0 y False cuando es menor a 0. En la siguiente columna «Tipo» va a escribir Positivo o Negativo dependiendo del valor de la columna «Valor«.
Por lo tanto en el procedimiento indicado arriba, las dos columnas que mencionamos «EsPositivo» y «Tipo» deberían de quedar así con sus respectivas expresiones:
VB
dt.Columns.Add("EsPositivo", GetType(Boolean), "IIF((Valor >= 0),True,False)") dt.Columns.Add("Tipo", GetType(String), "IIF((Valor >= 0),'Positivo','Negativo')")
C#
dt.Columns.Add("EsPositivo", typeof(bool), "IIF((Valor >= 0),True,False)"); dt.Columns.Add("Tipo", typeof(string), "IIF((Valor >= 0),\'Positivo\',\'Negativo\')");
Para este ejemplo vamos a ver los datos de esta forma:
Como vemos las columnas «EsPositivo» y «Tipo» tomaron correctamente los valores que nosotros le difinimos.
Ahora que pasa con los datos que modifiquemos de los actuales o si le agregamos nuevas filas, pues en estos casos los valores de estas columnas se cambian automáticamente conforme al valor de la columna «Valor».
Por ejemplo aquí le modificamos el valor al segundo registro para demostrar que estas columnas se cambian automáticamente.
Y aquí le agregamos dos nuevas filas para probar si los valores de cálculo salían bien en filas nuevas
Recordemos que estas dos columnas de valores «expression» no se pueden modificar manualmente, están en un valor definido de ReadOnly.
Descargar ejemplo: DataTable_Expresion.zip
[…] necesita una operación en dos o más columnas debe crear un DataColumn, establecer su propiedad Expression adecuada y utilizar una expresión de Compute en la columna resultante. En ese caso, dado un […]
[…] necesita una operación en dos o más columnas debe crear un DataColumn, establecer su propiedad Expression adecuada y utilizar una expresión de Compute en la columna resultante. En ese caso, dado un […]