2010-12-01 37 views
27

A qui cela peut concerner, j'ai cherché une quantité considérable de temps, de travailler un moyen de sortir de cette erreurErreur: informations de ligne supprimée ne peut pas être accessible par la ligne

"Deleted row information cannot be accessed through the row"

Je comprends qu'une fois de suite a été supprimé d'une base de données qu'il ne peut pas être accédé d'une manière typique et c'est pourquoi je reçois cette erreur. Le gros problème est que je ne suis pas sûr de ce qu'il faut faire pour obtenir le résultat souhaité, que je vais décrire ci-dessous.

Fondamentalement, lorsqu'une ligne dans "dg1" est supprimée, la ligne située en dessous remplace la ligne supprimée (évidemment) et hérite ainsi de l'index des lignes supprimées. Le but de cette méthode est de remplacer et de réinitialiser l'index des lignes (en le saisissant à partir de la valeur correspondante dans l'ensemble de données) qui a pris la place des lignes supprimées et en tant que telle la valeur de l'index.

En ce moment j'utilise juste un label (lblText) pour essayer d'obtenir une réponse du processus, mais il se bloque quand la dernière instruction if imbriquée essaie de comparer les valeurs.

Voici le code:

void dg1_Click(object sender, EventArgs e) 
    { 
     rowIndex = dg1.CurrentRow.Index; //gets the current rows 
     string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value); 

     if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted") 
     { 

      for (int i = 0; i < dg1.Rows.Count; i++) 
      { 

       if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
       //^**where the error is occurring** 
       { 
        lblTest.Text = "Aha!"; 
        //when working, will place index of compared dataset value into         rowState, which is displaying the current index of the row I am focussed on in 'dg1' 
       } 
      } 
     } 

Merci à l'avance pour l'aide, j'ai vraiment fait la recherche, et s'il est facile de comprendre grâce à une simple recherche google me permettent alors de haine répétable sur moi , parce que j'ai essayé.

  • gc

Répondre

31

La valeur actuelle de la colonne de données dans l'instruction interne if ne sera pas disponible pour les lignes supprimées. Pour récupérer une valeur pour les lignes supprimées, spécifiez que vous voulez la valeur d'origine. Cela devrait corriger votre erreur:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value) 
+0

Pourquoi utilisez-vous 'Convert.ToString' quand vous avez déjà utilisé' .ToString() '? Cela semble redondant. –

+0

@druciferre - Je suis d'accord que c'est redondant. J'ai copié le code original de l'OP et l'ai modifié pour utiliser la valeur originale du DataRow. – firedfly

0

après la suppression de la ligne, rebind votre grille avec datatable, pas nécessaire d'indexer manuellement, réinitialiser Handels DataTable il.

de sorte que vous ne devez pas redéfinir la source de données de la grille.

+0

Je suis désolé, je aurais dû préciser, je ne cherche pas à mettre à jour la source de données du tout, je suis en train de faire en sorte que, peu importe l'emplacement des lignes de la grille de données, la grille de données affichera toujours l'index de cette information tel qu'il est dans l'ensemble de données. ie - la ligne 2 de la grille de données renvoie un index de 1 mais dans l'ensemble de données, l'index de cette ligne est 2. sans valider la suppression de la base de données, je dois saisir l'index de cette ligne dataagrid donc la ligne correspondante dans dg (ligne avec les mêmes informations) montre un index de 2. – zillaofthegods

+0

peut-être que je suis confus par votre explication, je m'habitue toujours à la logique de l'accès à la base de données C#. – zillaofthegods

12

Dans votre « plantage si », vous pouvez vérifier si la ligne est supprimée avant d'accéder à ses valeurs:

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted && 
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
{ 
    // blaaaaa 
} 

Aussi, je ne sais pas pourquoi vous ToString() le RowState au lieu de le comparer à DataRowState.Deleted.

36

Vous pouvez également utiliser la méthode AcceptChanges() du DataSet pour appliquer complètement les suppressions.

ds.Tables[0].Rows[0].Delete(); 
ds.AcceptChanges();