[C#] Delete-funktion --> falsche ID wird übergeben

yellowspam

Erfahrenes Mitglied
Hi@all:

Ich habe ein GridView und dort habe ich einen Deletebutton.

So nun habe ich das GridView1_RowDeleting-Event erstellt und einige Funktionen zum löschen des Downloads geschrieben.

Nur habe ich das folgende Problem: Wenn ich die oberste Row löschen will dann löscht er sie, nur wenn ich eine andere Row lsöchen will holt sich die Funktion immer die ID der darüberliegenden Row. Vorgestern ging es noch, könnt ihr sagen wo mein Fehler liegt?

GridView1_RowDeleting:

C#:
void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {

            Classes.Downloads dl = this.Downloads;
            //Guid ID = new Guid(this.GridView1.Rows[e.RowIndex].Cells[2].Text.ToString());
            //Todo: Chaos copyright Stefan --> Chaos beseitigt

            string guidString = (string)this.GridView1.DataKeys[e.Keys.Count]["ID"];
            
            Guid ID;
            if (guidString != string.Empty)
            {
                ID = new System.Guid(guidString);
                dl.DeleteDownload(ID);
            }

       

            BindGrid();

        }

DeleteDownload-funktion:

C#:
public bool DeleteDownload(Guid ID)
        {
            try
            {
                dt = GetDownloads();
                ds.Tables.Clear();
                ds.Tables.Add(dt);

                bool IsDeleted = false;
                //geht alle Datensätze durch bis er die richtige ID findet
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    // wenn die id = der id des datasets ist, löschen wir den datensatz...
                    if (new Guid(ds.Tables[0].Rows[i]["ID"].ToString()) == ID)
                    {
                        //löscht den betreffenden Datensatz
                        ds.Tables[0].Rows[i].Delete();
                        IsDeleted = true;
                    }
                    
                }

                // schreibt ein neues xml...
                ds.WriteXml(Helper.FilePath);
                //gibt aus ob das File erfolgreich gelöscht wurde
                return IsDeleted;
            }
            catch (Exception e)
            {
                throw e;
            }            
        }
 
Dann muss es in der Zwischenzeit wohl eine Änderung gegeben haben, denn so ohne etwas ändert sich nichts ...

Zu deiner Frage: Bekommst du in der GridView1_RowDeleting schon eine falsche ID, oder wird nur in deiner Delete-Methode der falsche Datensatz gelöscht?
 
Ich und mein Kollege haben gestern eine Detailsview hinzugefügt, aber es wurde so nichts geändert, auch der index der Felder in der Gridview sind angepasst worden. :confused:

Zu deiner Frage: Bekommst du in der GridView1_RowDeleting schon eine falsche ID, oder wird nur in deiner Delete-Methode der falsche Datensatz gelöscht?

Es wird von anfang an die falsche ID übergeben und es wird der falsche Datensatz gelöscht.
 
Ist jetzt war keine feine Lösung, aber schau dir mal an was für ein Wert übergeben wird wenn du es wie folgt abrufst, so in etwa hast du es in deinem Code schon stehen nur auskommentiert:

Code:
GridView1.Rows[e.RowIndex].Cells[0].Text

Da wo die 0 steht muss der Index von der Zeile hin, wo Index steht. Als Beispiel:
Code:
Spalte: ID | Name
Index:  0  | 1
 
Ja, so hatte ich es auch, aber der Chef hat es getestet und gesgat ich solls mit DataKeys machen, weil es sonst zu groben Fehlern kommt.
 
Was für grobe Fehler? Du fängst einfach ab, ob der Index nicht -1 ist und ob es nicht leer ist:

Code:
if (e.RowIndex != -1 && GridView1.Rows[e.RowIndex].Cells[0].Text != "")

Dann kommen schonmal die "gröbsten" Fehler nicht mehr.
 
Und eine Lösung für die Methode die ich oben gepostet habe gibt es nicht? Mein Chef ist nicht wirklich zufrieden mit dieser Lösung.
 
Hmm also ich sehe in dem Code jetzt auch keinen wirklichen Fehler und die Aussage vorgestern hats noch funktioniert macht es nicht einfacher :p

Schau dir mal im Debugger folgende Zeile genauer an, den die ist ja für die ermittlung der ID zuständig:
Code:
string guidString = (string)this.GridView1.DataKeys[e.Keys.Count]["ID"];

Btw. kann es so richtig sein das du als Index die Anzahl der Elemente von den Keys zurückgibst?
 
Ich weiß leider selbst nicht genau was die Datakeys eigentlich machen bzw. wofür die gut sind. :(

Hier, so habe ich sie definiert:

Ist ein Array

C#:
 //Erstellt ein Array 'keys' 
            DataColumn[] Keys = new DataColumn[1];
            Keys[0] = dt.Columns["ID"];
           
            dt.PrimaryKey = Keys;
 
Ich hab zur Zeit leider keine Möglichkeit es nachzubasteln, aber schau mal was dir folgender Code zurückliefert:
Code:
GridView1.DataKeys[e.Keys["ID"]].Value.ToString();
// oder
GridView1.DataKeys[e.RowIndex].Value.ToString();
 

Neue Beiträge

Zurück