2010-12-01 9 views
27

Um Zugriff auf wen das betreffen kann, habe ich eine beträchtliche Menge an Zeit gesucht, einen Ausweg aus diesem Fehler arbeitenFehler: Gelöschte Zeileninformation nicht durch die Reihe

"Deleted row information cannot be accessed through the row"

Ich verstehe, dass, sobald eine Reihe wurde aus einer Datentabelle gelöscht, auf die nicht in einer typischen Weise zugegriffen werden kann, und deshalb erhalte ich diesen Fehler. Das große Problem ist, dass ich nicht sicher bin, was ich tun soll, um mein gewünschtes Ergebnis zu erhalten, was ich unten skizzieren werde.

Grundsätzlich, wenn eine Zeile in "dg1" gelöscht wird, übernimmt die darunter liegende Zeile (offensichtlich) die Stelle der gelöschten Zeile und erbt damit den gelöschten Zeilenindex. Der Zweck dieser Methode besteht darin, den Zeilenindex zu ersetzen und zurückzusetzen (indem er von dem entsprechenden Wert im Dataset übernommen wird), der den gelöschten Zeilenplatz und somit den Indexwert verwendet hat.

Im Moment benutze ich nur eine Bezeichnung (lblText), um eine Antwort vom Prozess zu bekommen, aber es stürzt ab, wenn die letzte verschachtelte if-Anweisung versucht, Werte zu vergleichen. Hier

ist der 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' 
       } 
      } 
     } 

Dank im Voraus für die Hilfe, ich habe Suche wirklich, und wenn es einfach ist, eine einfache Google-Suche, um herauszufinden, durch dann lass mich wiederholbar auf mich zu hassen , weil ich es versucht habe.

  • gc

Antwort

31

Der aktuelle Wert für die Datenspalte in der inneren if-Anweisung ist für gelöschte Zeilen nicht verfügbar. Um einen Wert für gelöschte Zeilen abzurufen, geben Sie an, dass Sie den ursprünglichen Wert verwenden möchten. Dies sollte Ihre Fehler beheben:

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

Warum verwenden Sie 'Convert.ToString', wenn Sie' .ToString() 'bereits verwendet haben? Dies scheint überflüssig zu sein. –

+0

@druciferre - Ich stimme zu, dass es überflüssig ist. Ich kopierte den Originalcode des OP und modifizierte ihn, um den ursprünglichen Wert von DataRow zu verwenden. – firedfly

0

nach der Zeile zu löschen, das Raster mit der Datentabelle erneut binden, keine Notwendigkeit, manuell zurückzusetzen Index, es handel Datentabelle.

so müssen Sie nur die Datenquelle des Gitters neu binden.

+0

Es tut mir leid ich habe geklärt sollte, ich bin nicht die Datenquelle überhaupt zu aktualisieren versuchen, ich versuche, es zu machen, so dass, unabhängig von der Position der Zeilen in der Datagrid wird das Datagrid immer zeigen der Index dieser Informationen wie im Datensatz. dh Zeile 2 des Datagrids gibt einen Index von 1 zurück, aber im Dataset ist der Index dieser Zeile 2. Ohne die Löschung an die Datenbank zu übergeben, muss ich den Index dieser Zeile aus dem Dataset entnehmen und in die Datei einfügen Datagrid, also die entsprechende Zeile in dg (Zeile mit den gleichen Informationen) zeigt einen Index von 2. – zillaofthegods

+0

vielleicht bin ich verwirrt durch Ihre Erklärung, ich bin immer noch an die Logik der C# -Datenbank zugreifen. – zillaofthegods

12

In Ihrem „abstürzt, wenn“ können Sie überprüfen, ob die Zeile vor dem Zugriff gelöscht wird es Werte:

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

Auch ich bin nicht sicher, warum Sie ToString() den RowState, anstatt ihn mit DataRowState.Deleted zu vergleichen.

36

Sie können auch die AcceptChanges() - Methode des DataSet verwenden, um die Löschungen vollständig anzuwenden.

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