Una forma sencilla de convertir una matriz de fila de datos en una tabla de datos


Respuestas:


91

¿Por qué no iterar a través de su matriz DataRow y agregar (usando DataRow.ImportRow, si es necesario, para obtener una copia de DataRow), algo como:

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

Asegúrese de que su dataTable tenga el mismo esquema que DataRows en su matriz DataRow.


1
Esta técnica es útil si recibe el mensaje de error "Se está utilizando una fuente de datos no válida para MyControl. Una fuente de datos válida debe implementar IListSource o IEnumerable" al intentar vincular un DataRow directamente a la propiedad DataSource de un control. He aquí cómo hacerlo:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
Humbads

+1 ¡Prefiero esto en lugar de rowArray.CopyToDataTable();porque mantiene el esquema de la tabla y no lo reemplaza con un nuevo objeto de tabla!
Mojtaba Rezaeian

7
Muy bien ! Pero sugeriría clonar el DataTable antes del foreach. Copia el formato de la DataTable: newDataTable = oldDataTable.clone ();
Latigazo

2
Sugerencia: su tabla de datos debe tener columnas creadas o no se llenará correctamente.
logixólogo

192

Para .Net Framework 3.5+

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

Pero si no hay filas en la matriz, puede causar errores como El origen no contiene DataRows . Por lo tanto, si decide utilizar este método CopyToDataTable(), debe verificar la matriz para saber si tiene filas de datos o no.

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

Referencia disponible en MSDN: Método DataTableExtensions.CopyToDataTable (IEnumerable)


1
De dónde sacaste copyToDataTable()? No lo encontré en .net 2.0
SMUsamaShah

11
Esto debe marcarse como una respuesta correcta ya que el copyToDataTable()método crea una copia perfecta de las columnas de las filas seleccionadas, mientras que el datatable.ImportRow(row)método no lo hace
Dante

5
este método no es bueno si la tabla ya tiene filas, ya que reemplaza lo que ya está allí. Si la mesa está vacía para empezar, está bien.
Franck

5
Prefiero este método siempre que las funciones .Net estén optimizadas. No olvide agregar la referencia a System.Data.DataSetExtensions en su proyecto para que no se frustre preguntándose por qué falta este método (como yo)
Broken_Window

Recuerde agregar el ensamblado System.Data.DataSetExtensions en las referencias
Vagner Gon

12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);

2
Ya lo intenté así ... Se produce un error como "La matriz de entrada es más larga que el número de columnas de esta tabla".
Developer404

Como señaló Jay, asegúrese de que su tabla de datos tenga el mismo esquema que DataRows en su matriz DataRow
Mitch Wheat

1
Sí ... lo intenté. Usé Datatable1 = datatable2.Clone (); Ahora está funcionando ... Gracias :-)
Developer404

Intenté esto con una matriz de filas y no funcionó. Para cada fila en la matriz de filas, creé una nueva fila, copié la propiedad ItemArray de la fila original y luego la adición funcionó.
Steve

1
Esto no parece funcionar en .NET Framework 4.0 con el ejemplo publicado, ni con la clonación de "dt" de dstata.tables [0]. La respuesta de @ joe terminó funcionando para mis propósitos. Error de versión sin clonar: " Input array is longer than the number of columns in this table.". Error de versión con clonación: " Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64." Nota: StoreOrderes la primera columna del esquema de la tabla. Parece que está intentando meter toda la fila de datos en esa primera columna
Brian Webster

11

Otra forma es usar un DataView

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");

9

La forma sencilla es:

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   

4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5+ agregó DataTableExtensions, use el método DataTableExtensions.CopyToDataTable

Para la matriz de fila de datos, simplemente use .CopyToDataTable () y devolverá la tabla de datos.

Para uso en una sola fila de datos

new DataRow[] { myDataRow }.CopyToDataTable()

2

Aqui esta la solucion. Debería funcionar bien.

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 

1

En caso de que alguien lo necesite en VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next

1

Podrías usar System.Linq así:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

1

Primero debe clonar la estructura de la tabla de datos y luego importar las filas usando el bucle for

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.