Je veux convertir un tableau DataRow
en DataTable
... Quelle est la manière la plus simple de faire ceci?Façon simple de convertir la matrice de datarow en datable
Répondre
Pourquoi ne pas itérer votre tableau de DataRow et ajouter (en utilisant DataRow.ImportRow, si nécessaire, pour obtenir une copie du DataRow), quelque chose comme:
foreach (DataRow row in rowArray) {
dataTable.ImportRow(row);
}
Assurez-vous que votre dataTable a même schéma que les DataRows dans votre tableau DataRow.
DataTable dt = new DataTable();
DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");
dt.Rows.Add(dr);
J'ai déjà essayé comme ça .. Une erreur se produit quelque chose comme « tableau d'entrée est plus longue que le nombre de colonnes dans cette table. " – Nila
AS Jay a souligné, Assurez-vous que votre dataTable a le même schéma que les DataRows dans votre tableau DataRow –
Oui .. J'ai essayé. J'ai utilisé Datatable1 = datatable2.Clone(); Maintenant ça marche ... Merci :-) – Nila
NET Framework 3.5+
DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();
Mais s'il n'y a pas de lignes dans le tableau, il peut provoquer des erreurs telles que La source ne contient pas DataRows. Par conséquent, si vous décidez d'utiliser cette méthode CopyToDataTable()
, vous devez vérifier le tableau pour savoir s'il a des données ou non.
if (dr.Length > 0)
DataTable dt1 = dr.CopyToDataTable();
Référence disponible sur MSDN: DataTableExtensions.CopyToDataTable Method (IEnumerable)
J'aime celui-ci. –
D'où avez-vous eu 'copyToDataTable()'? Je ne l'ai pas trouvé dans .net 2.0 – SMUsamaShah
. Net Framework 3.5+ –
Voici la solution. Cela devrait fonctionner correctement.
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);
}
Une autre façon est d'utiliser 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");
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{
dt.ImportRow(dr);
}
Une façon simple est:
// 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());
Incase quelqu'un a besoin dans VB.NET:
Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
yourNewDataTable.ImportRow(dataRow)
Next
.Net 3.5+ ajouté DataTableExtensions, utilisez DataTableExtensions.CopyToDataTable Méthode
Pour datarow ensemble il suffit d'utiliser .CopyToDataTable() et il retournera datatable.
Pour une utilisation unique datarow
new DataRow[] { myDataRow }.CopyToDataTable()
Vous pouvez utiliser System.Linq comme ceci:
if (dataRows != null && dataRows.Length > 0)
{
dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
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);
}
Please ajouter quelques explications sur le code fourni –
Cette technique est utile si vous obtenez le message d'erreur "Une source de données valide est utilisée pour MyControl.Une source de données valide doit implémenter IListSource ou IEnumerable" lorsque vous essayez de lier un DataRow directement à la propriété DataSource d'un contrôle. Voici comment faire: 'DataTable dataTable = new DataTable(); dataTable.ImportRow (dataRow); MyControl.DataSource = dataTable; ' – humbads
+1 Je préfère ceci plutôt que' rowArray.CopyToDataTable(); 'car cela conserve le schéma de la table et ne le remplace pas par un nouvel objet table! –
Très bien! Mais je suggérerais de cloner le DataTable avant le foreach. Il copie le format de DataTable: newDataTable = oldDataTable.clone(); – Whiplash