Tengo un DataTable llamado dt1 que contiene muchos datos. Entre esos datos hay dos columnas llamadas "Nombre y Apellido" y "Edad". Deseo poner en otro DataTable los datos de todas las personas mayores de 18 años y que no sean Juan Perez ó Juan Pérez.
Los DataTables tienen una propiedad Select que acepta consultas tipo SQL para filtrar datos en función a los nombres de sus columnas. Si estos nombres contienen espacios se deben poner entre corchetes.
El código es el siguiente:
string query = @"([Nombre y Apellido] <> 'Juan Perez' or
[Nombre y Apellido] <> 'Juan Pérez') and Edad > 18";
DataTable dtFin = new DataTable();
DataRow[] miFiltro = dt1.Select(query);
if (miFiltro.Length > 0)
{
// primero añado las columnas con su respectivo nombre
for (int i = 0; i < miFiltro[0].Table.Columns.Count; i++)
dtFin.Columns.Add(miFiltro[0].Table.Columns[i].ColumnName);
// añado las filas
for (int i = 0; i < miFiltro.Count(); i++)
dtFin.Rows.Add(miFiltro[i]);
}
Pero al correr este código me tiraba una exceción del tipo "ArgumentException Esta fila ya pertenece a otra tabla".
Buscando en Internet, Pedro Hurtado me dió la solución. (yo no hice la pregunta, pero que es la solución, lo es :D)
El código correcto es:
string query = @"([Nombre y Apellido] <> 'Juan Perez' or
[Nombre y Apellido] <> 'Juan Pérez') and Edad > 18";
DataTable dtFin = new DataTable();
DataRow[] miFiltro = dt1.Select(query);
if (miFiltro.Length > 0)
{
// primero añado las columnas con su respectivo nombre
for (int i = 0; i < miFiltro[0].Table.Columns.Count; i++)
dtFin.Columns.Add(miFiltro[0].Table.Columns[i].ColumnName);
// añado las filas
for (int i = 0; i < miFiltro.Count(); i++)
dtFin.Rows.Add(miFiltro[i].ItemArray);
}
Faltaba ponerle la propiedad ItemArray al añadir los DataRows de miFiltro al DataTable dtFin.
Códigos de ejemplo para aprender distintas tecnologías, o lo que sucede cuando a una cuarentona se la deja sola con una computadora
jueves, 29 de noviembre de 2012
sábado, 17 de noviembre de 2012
Convertir los datos en la propiedad DataSource de un DataGridView en un DataTable
Se pueden convertir, ó pasar, los datos almacenados en la propiedad DataSource de un DataGridView a un DataTable con el siguiente código:
Este código no funciona para casos en que los datos se añadieron al DataGridView con el método "Add" de las propiedades "Rows" y "Columns", dado que éstas no modifican a la propiedad "DataSource".
Por ejemplo, en el siguiente código:
El DataGridView se ve así:
Pero el DataTable "dt" es nulo, pues la propiedad "DataSource" no tiene ningún valor asignado.
DataTable dt = (DataTable)miDataGridView.DataSource;
Este código no funciona para casos en que los datos se añadieron al DataGridView con el método "Add" de las propiedades "Rows" y "Columns", dado que éstas no modifican a la propiedad "DataSource".
Por ejemplo, en el siguiente código:
miDataGridView.DataSource = null;
miDataGridView.Columns.Add("p1", "Prueba 1");
miDataGridView.Columns.Add("p2", "Prueba 2");
object[] obj = {"p1", "p2"};
miDataGridView.Rows.Add(obj);
DataTable dt = (DataTable)miDataGridView.DataSource;
miDataGridView.Columns.Add("p2", "Prueba 2");
object[] obj = {"p1", "p2"};
miDataGridView.Rows.Add(obj);
DataTable dt = (DataTable)miDataGridView.DataSource;
El DataGridView se ve así:
Pero el DataTable "dt" es nulo, pues la propiedad "DataSource" no tiene ningún valor asignado.