Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

jueves, 29 de noviembre de 2012

Propiedad Select de un DataTable y Error al añadir un DataRow: ArgumentException Esta fila ya pertenece a otra tabla

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.

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:

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;

El DataGridView se ve así:


Pero el DataTable "dt" es nulo, pues la propiedad "DataSource" no tiene ningún valor asignado.