J'ai une gain de parent qui a un plus tard sur , Le problème est que, après une suppression après une suppression, l'exception suivante est lancée:
Le travail autour de celui que j'utilise actuellement (ce qui ressemble à un piratage) est le suivant: P> < Pré> XXX PRE> Ma question: Est-ce la bonne façon de faire cela? Pourquoi les lignes d'accès à boucle de foresach seraient-elles étiquetées via la méthode myDataTable code> en tant que membre. Le type mydatable a été créé dans l'outil "DataSet Taped DataSet" dans Visual Studio 2005 (Hérités mydatables de DataTable)
_dt code> est renseigné à partir d'une DB via ADO.NET. Sur la base des modifications de l'interaction de l'utilisateur sous la forme, je supprime une ligne de la table comme suit:
_dt.findbysomekey (_somekey) .Delete (); code> p>
_dt code> est transmis par la valeur à un formulaire de dialogue. À partir de là, j'ai besoin de numériser à travers toutes les lignes pour créer une chaîne: p>
Suppr SuppleDowinAccessableException: Les informations sur la ligne supprimée ne peuvent être accessibles à la ligne. Code> p>
Suppr () code> ?? p> p>
5 Réponses :
le en C # 3, vous pouvez remplacer votre voici une version C # 2: P > Supprimer code> méthode
marque une ligne de suppression; la ligne n'est pas effectivement supprimée tant que vous appelez accepter code>.
_dt.rows.remove (_dt.findbysomey (_somekey)) code>, qui sera Acceptez également le changement.
Croyez-le ou non, row.remove Code> Supprimera complètement la ligne, tandis que
. grève>
Notez que si vous appelez rangée.delete () code> ne sera pas
rows.remove code>, la ligne sera disparue de manière permanente et ne sera pas supprimée de la base de données par un datadapter. P>
si code> instruction avec la méthode d'extension suivante: p>
modifier h1>
partial class MyTable {
public IEnumerable<MyRow> CurrentRows() { return Utils.CurrentRows(this); }
}
Merci pour la réponse. En le faisant de cette façon, il y aura des implications lorsque j'essaie de mettre à jour ma table à la DB? _DT.UPDATE () La mise à jour () savoir () savoir pour supprimer cette ligne à l'aide de la suppression ou est-ce "parti pour le bien?"
@Ken: Non, les lignes supprimées pas i> sont supprimées lors d'une mise à jour. Supprimer! = Supprimer
@Ken: bon point; Je supposerais que Calling Supprimer causera update code> pour ne pas le supprimer. Essayez-le.
@Slaks - appeler Supprimer provoque la mise à jour de ne pas la supprimer dans la DB. De plus, C # 3 n'est pas valable pour moi (en utilisant 2.0), mais merci pour votre contribution!
@Slaks Votre C # 2 Verson n'est pas approprié => Public Static iEnumerable
Vous devrez vérifier:
_dt.DefaultView.RowStateFilter
Cela n'affectera pas l'énumérateur de la table.
@Slaks: J'ai écrit: "Et boucle sur la vue"
@HENK: J'ai fini par boucler sur le DataView (qui par défaut ne contient pas les enregistrements supprimés), comme: TRANEACH (RIGURE DE DATAREWVIEW IN _DT.DEFAULTVIEW) {SBFILTER.Append ("'" + (myDataTataBerow) .Row) .info + "'", "); } code> sur toutes les options proposées, je pense que c'est la manière la plus propre. Merci!
Je ne suis pas sûr de cela, mais je pense que si vous appelez _dt.acceptchanges () code> Après avoir supprimé une ou plusieurs lignes, vous ne "voir" pas les lignes supprimées lorsque vous iTERE Collection de lignes de tables de données. P>
AcceptChanges Supprime l'état de la rangée et j'ai besoin de cet état plus tard lorsque je fais un _dt.Unupdate () pour persister les modifications à la DB. Je voudrais probablement appeler AcceptChanges () après la mise à jour. Merci!
Utiliser getchanges ():
foreach (myDataTableRow row in _dt.GetChanges(DataRowState.Added | DataRowState.Modified)) { sbFilter.Append("'" + row.info + "',"); }
Une bonne idée, mais cela produit en fait une erreur de compilateur car le jeu de données ne contient pas de méthode de getenumerator ().
Cela ne retournera pas des rangées inchangées.
@Slaks: Malgré le nom Getchanges, vous pouvez obtenir des lignes non modifiées, _dt.getchanges (datarseate.unchanged)
Ce que vous faites pour sauter les lignes de votre itération est correct, je vérifie régulièrement la rampe lorsque je me loge sur un jeu de données pouvant être modifié.
Dans certains cas, je veux que la valeur de la ligne d'origine avant le La ligne a été marquée comme supprimée. Il existe une option d'index secondaire lors de la récupération d'une valeur de datarow particulière. P>
string st = dr["columnname", DataRowVersion.Original].ToString(); // c# dim st As String = dr("columnname", DataRowVersion.Original).ToString() ' vb.net
Vous n'avez pas besoin de rechercher
détaché code>.