106 votes

Une façon simple de convertir un tableau de données en table de données.

Je veux convertir un DataRow en DataTable ... Quelle est la façon la plus simple de procéder ?

205voto

joe Points 1061

Pour .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, cela peut causer des erreurs telles que La source ne contient pas de DataRows . Par conséquent, si vous décidez d'utiliser cette méthode CopyToDataTable() vous devez vérifier le tableau pour savoir s'il contient des datarows ou non.

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

Référence disponible sur MSDN : Méthode DataTableExtensions.CopyToDataTable (IEnumerable)

1 votes

D'où tenez-vous copyToDataTable() ? Je ne l'ai pas trouvé dans .net 2.0.

11 votes

Ceci devrait être marqué comme une bonne réponse puisque copyToDataTable() crée une copie parfaite des colonnes des lignes sélectionnées, tandis que la méthode datatable.ImportRow(row) La méthode ne fonctionne pas

5 votes

Cette méthode n'est pas bonne si la table a déjà des lignes, car elle remplace ce qui est déjà là. Si la table est vide au départ, c'est bon.

97voto

Jay Riggs Points 30783

Pourquoi ne pas itérer à travers 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 le même schéma que les DataRows de votre tableau DataRow.

1 votes

Cette technique est utile si vous obtenez le message d'erreur "An invalid data source is being used for 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 procéder : DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;

0 votes

+1 Je préfère cela plutôt que rowArray.CopyToDataTable(); parce que cela conserve le schéma de la table et ne le remplace pas par un nouvel objet de table !

9 votes

Très bien ! Mais je voudrais suggérer de cloner la DataTable avant le foreach. Il copie le format de la DataTable : newDataTable = oldDataTable.clone() ;

12voto

Mitch Wheat Points 169614
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2 votes

J'ai déjà essayé comme ça Une erreur se produit, du genre "Le tableau d'entrée est plus long que le nombre de colonnes de ce tableau".

0 votes

Comme Jay l'a souligné, assurez-vous que votre DataTable a le même schéma que les DataRows de votre tableau DataRow.

1 votes

Oui, j'ai essayé. J'ai utilisé Datatable1=datatable2.Clone() ; Maintenant, cela fonctionne... Merci :-)

11voto

ilan Points 61

Une autre méthode consiste à 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");

5voto

Miriam Points 31
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X