7
votes

Accéder aux lignes supprimées d'un jeu de données

J'ai une gain de parent qui a un myDataTable 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 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 ();

plus tard sur , _dt 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: xxx

Le problème est que, après une suppression après une suppression, l'exception suivante est lancée: Suppr SuppleDowinAccessableException: Les informations sur la ligne supprimée ne peuvent être accessibles à la ligne.

Le travail autour de celui que j'utilise actuellement (ce qui ressemble à un piratage) est le suivant: < Pré> XXX

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 Suppr () ??


1 commentaires

Vous n'avez pas besoin de rechercher détaché .


5 Réponses :


14
votes

le Supprimer code> méthode marque une ligne de suppression; la ligne n'est pas effectivement supprimée tant que vous appelez accepter code>.

à la place, appelez _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 rangée.delete () code> ne sera pas . grève> Notez que si vous appelez 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>

en C # 3, vous pouvez remplacer votre si code> instruction avec la méthode d'extension suivante: p> xxx pré>

modifier h1>

voici une version C # 2: P >

partial class MyTable {
    public IEnumerable<MyRow> CurrentRows() { return Utils.CurrentRows(this); }
}


5 commentaires

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 sont supprimées lors d'une mise à jour. Supprimer! = Supprimer


@Ken: bon point; Je supposerais que Calling Supprimer causera update 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 CURCORROWS (TABLE (TABLE ) Où TROW: DataRow {Foreach (TRUH Row in Table) {if (Row.rowstate! = Datewstate .Deletted) rangée de rendement de rendement; }}



2
votes

Vous devrez vérifier:

 _dt.DefaultView.RowStateFilter


3 commentaires

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 + "'", "); } sur toutes les options proposées, je pense que c'est la manière la plus propre. Merci!



0
votes

Je ne suis pas sûr de cela, mais je pense que si vous appelez _dt.acceptchanges () 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.


1 commentaires

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!



1
votes

Utiliser getchanges ():

foreach (myDataTableRow row in
    _dt.GetChanges(DataRowState.Added | DataRowState.Modified))
{
    sbFilter.Append("'" + row.info + "',");
}


3 commentaires

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)



6
votes

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


0 commentaires