En Toute Sécurité Enlever DataRow Dans Le ForEach
Je ne comprends pas pourquoi ce code ne fonctionne pas.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
- Semble fonctionner pour moi. Je suppose que dataTable.Les lignes.Supprimer(dataRow); ne fonctionne pas, cependant.
Vous devez vous connecter pour publier un commentaire.
Même si
DataRow.Delete
ne modifie pas l'état de la collection, La documentation de Microsoft états que vous ne devriez pas l'appeler lors de l'itération sur la collection:La meilleure solution est généralement de créer une collection à part (par exemple, un
List<DataRow>
) des éléments que vous souhaitez supprimer, puis supprimer après vous avez fini de l'itération.C'est aussi la solution pour les situations où vous souhaitez supprimer des éléments d'une collection, comme la plupart des collections .NET ne vous permettra pas de modifier le contenu de la collection, tandis que vous êtes une itération sur elle.
Manière la plus sûre d'utiliser
for
boucleN'oubliez pas de
AcceptChanges
pour supprimer tous marqués de lignes:if (true)
est un espace réservé pour le vérifier, vous avez besoin de supprimer la ligne. Sinon tous vos lignes à partir d'une datatable sera suppriméVous ne pouvez pas modifier une collection, tandis que vous êtes une itération à l'aide d'un
foreach
déclaration.vous pouvez essayer quelque chose comme ça :
for(int i = datatable.Rows.length - 1; i >= 0; i --) { //remove rows }
Select()
méthode crée une nouvelle collection contenant toutes les lignes de la précédente collection. Vous n'êtes pas de l'itération sur l'original de la collection, qui contient la ligne à supprimer.Si vous appelez la méthode delete vous avez juste à appeler
AcceptChanges()
sur la table que vous êtes en train de modifier, après la boucle foreach.La méthode delete marque simplement la ligne pour la suppression.
http://msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=VS.90%29.aspx
peut-être que ma réponse n'est pas plus utile.
exception jeter dans le Foreach avec DataRow n'apparaissent que dans le .Net 2.0 et les versions antérieures, la raison en est la description sur le site msdn
http://msdn.microsoft.com/en-us/library/system.data.datarow.delete(v=vs. 80).aspx
Si le RowState de la ligne est Ajoutée, la ligne est supprimée de la table.
La RowState devient Supprimés une fois que vous utilisez la méthode Delete. Il reste Supprimée jusqu'à ce que vous appelez AcceptChanges.
Une ligne supprimée peut être récupéré en invoquant RejectChanges.
pour contourner ce problème, vous pouvez appeler DataTable.AcceptChanges() avant d'utiliser foreach
Veuillez Consulter les boutons understatnd le travail de.
J'Espère que ce problème résolu maintenant.
La
Rows
modifications de contenu pendant que vous êtes itération si vous supprimez une ligne, ce qui rend l'itération non valide.Cependant, vous pouvez copier les lignes dans une collection premier et parcourir la collecte et supprimez les lignes de chemin. Cela permet de s'assurer que l'itération n'est pas interrompu par la modification des données à être réitéré.
La manière la plus simple d'y parvenir en utilisant une Liste de carte les lignes que vous souhaitez supprimer, puis sur supprimer les lignes à l'extérieur DataTable itération.
C#
VB
Il existe une autre version de celui-ci (je pense plus facile) ce que j'ai simplement utilisé:
Plus vite.
Seulement pour les personnes qui sont à la recherche d'un scénario spécifique, comme moi,
J'avais besoin de raccourcir le temps de prise, et une fois que certaines informations extraites de chaque ligne, j'ai exclu la ligne de marquage comme supprimé.
Espère que cela aide quelqu'un...
Cela s'applique à presque n'importe quelle collection. Si vous essayez de supprimer un article tout en parcourant la collection, vous aurez un problème. Par exemple, si vous supprimez la ligne n ° 3, puis la rangée précédente #4 devient la ligne #3.
Où les éléments ont une
Count
, c'est ce que j'ai fait:Noter que, lorsque les objets ont une
.GetXXXX()
collection, commeFileInfo
(IIRC),la suppression de l'élément contenu dans un
foreach
est acceptable. Une solution que j'ai envisagée est la création d'une méthode d'extension qui fournit un.GetItems()
méthode.Utiliser ceci:
(int i - mydatatable.rows.count -1; i >= 0; i--)
Votre chemin peut conduire à des lignes ignorées (et, dans mon expérience, le fait habituellement.C'est parce qu'il ressemble à essayer de démonter l'escalier de l'escalier que vous montez. Simplement, vous ne pouvez pas supprimer un élément que vous itérer.
Par conséquent, vous devez utiliser différents matrice d'itération et les retirer de la datatable
Rows
propriété.Sûr Magents
C'est la façon dont je l'ai fait et fonctionne très bien