Avatar billede nielsen2002 Nybegynder
16. januar 2007 - 10:13 Der er 7 kommentarer og
1 løsning

Slet Row i DataTable

Hej Eksperten,

Jeg har en Datable som jeg gemmer en indkøbs kurv i.
Jeg har X kolonner i min Datable hvor af den første kolonne er en form for PrimaryKey, som jeg i tilfælde at at jeg vil slette noget fra min kurv, regnede med at bruge.

Jeg kan dog ikke helt greje hvordan jeg skal gå ind i min DataTable og finde rækken med ID X og slette den.

Funktionen til sletning skal ligge i en click event, som indtil nu ser sådan ud:

protected void delbtn_Click(object sender, EventArgs e)
    {
        LinkButton lb = sender as LinkButton;
        DataTable objDT = (DataTable)Session["Cart"];
        DataRow[] foundRow;
        foundRow = objDT.Select("ID = " + lb.CommandArgument);       
         
           
    }
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 10:17 #1
prøv med:
objDT.Select("ID = " + lb.CommandArgument).Delete();
Avatar billede nielsen2002 Nybegynder
16. januar 2007 - 10:30 #2
Jeg får fejlen:
CS0117: 'System.Array' does not contain a definition for 'Delete'

hvis jeg prøver at skyde den linie afsted.
Avatar billede nielsen2002 Nybegynder
16. januar 2007 - 10:33 #3
Gik fra starten ud af at det skulle gøre således:

foreach (DataRow objDR in objDT.Rows) {
  if (Convert.ToInt32(objDR["ID"]) == Convert.ToInt32(lb.CommandArgument))
  {               
    objDR.Delete();
  }     
}

Men det giver fejlen:

Collection was modified; enumeration operation might not execute.

Har læst mig frem til at det er fordi det vil påvirke Indexeringen i Loopet hvis man sletter noget inden loopet er kørt.
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 10:38 #4
du kan prøve med

foreach (DataRow objDR in objDT.Rows) {
  if (Convert.ToInt32(objDR["ID"]) == Convert.ToInt32(lb.CommandArgument))
  {             
    objDR.Delete();
  }   
}

objDR.AcceptChanges();
Avatar billede nielsen2002 Nybegynder
16. januar 2007 - 10:44 #5
Det er også prøvet, med samme resultat.
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 10:54 #6
problemet som du selv skriver er at du forsøger at iterer over en collection som du også forsøger at slette fra.
For at undgå problemer med dette skal du bruge et for loop i stedet for et foreach loop.

  for (int i = 0; i < objDR.Rows.Count; i++)
                    {
                        if(Convert.ToInt32(objDR.Rows[i]["ID"] == Convert.ToInt32(lb.CommandArgument))
                        {
                            objDR.Rows.RemoveAt(i);
                        }
                    }
Avatar billede nielsen2002 Nybegynder
16. januar 2007 - 11:02 #7
Det var lige hvad der skulle til, Nu funger det bare, Smid et svar så får du kage :)
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 11:18 #8
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester