24. oktober 2003 - 16:19Der er
15 kommentarer og 1 løsning
Rækker i dataset forsvinder
Hej
Jeg har en metode som tjekker om en medarbejder er ledig.
int employeeID; DataSet employedIDsDS = GetEmployedIDs(searchplace); // HEr får jeg alle 16 medarbejderID = 16 rækker // 2. Investigate each employeeId for status histories for ( int i=0; i < employedIDsDS.Tables[0].Rows.Count; i++) { employeeID = (int)employedIDsDS.Tables[0].Rows[i]["EmployeeID"]; // Herinde forsvinder 3 medarbejder id, så der pludselig kun er 13 rækker // 3. Remove employeeID if it has an entry in the status history if (HasEntryInStatusHistory(employeeID, bookingStart, searchDate)) { employedIDsDS.Tables[0].Rows[i].Delete(); employedIDsDS.Tables[0].Rows[i].AcceptChanges(); } } // Inden vi returnere kommer de 3 manglende rækker på igen, men uden at blive undersøgt om de er ledige... return employedIDsDS;
Er der nogen der kan komme med en forklaring og løsning til dette? Gerne hurtigt?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Der er ikke noget i den kode du viser inden step 3 der kan fjerne elementer i DataSettet. så der må være noget andet kode der gør det. Det eneste der kunne være galt i den viste, er hvis der er 3 employees der ikke har et employeeID.
Hvis jeg skriver dem ud med en forløkke inden step 2 på præcis samme måde får jeg alle id, men lige så snart det kommer sammen med metoden HasEnty, så går der ged i det
Har du prøvet at "steppe" igennem løkken og se hvad der sker? Jeg tror altså ikke helt på, at dataene forsvinder ud fra datasetet... Hvad sker der hvis du i løkken udskriver employeeID - får du så ikke alle 16 ID's?
Nej ikke når det er inde i for ( int i=0; i < employedIDsDS.Tables[0].Rows.Count; i++) { employeeID = (int)employedIDsDS.Tables[0].Rows[i]["EmployeeID"]; //Her får jeg kun 13 id skrevet ud if (HasEntryInStatusHistory(employeeID, bookingStart, searchDate)) { employedIDsDS.Tables[0].Rows[i].Delete(); employedIDsDS.Tables[0].Rows[i].AcceptChanges(); } }
Hvis jeg fjerner: if (HasEntryInStatusHistory(employeeID, bookingStart, searchDate)) { employedIDsDS.Tables[0].Rows[i].Delete(); employedIDsDS.Tables[0].Rows[i].AcceptChanges(); } og bruger samme løkke og skriver id ud, får jeg alle 16 ?????
Nå ja, klart nok :-) Når du siger .Delete() forsvinder rækken jo fra datasetet - men din "i" kører jo bare videre opad... Når du sletter et element, skal "i" ikke tælles op, som den bliver i løkken!
int i = 0; while (i < employedIDsDS.Tables[0].Rows.Count) { employeeID = (int)employedIDsDS.Tables[0].Rows[i]["EmployeeID"]; if (HasEntryInStatusHistory(employeeID, bookingStart, searchDate)) { employedIDsDS.Tables[0].Rows[i].Delete(); employedIDsDS.Tables[0].Rows[i].AcceptChanges(); } else i++; }
Problemet er at alle Id ikke kommer ind i metoden HasEntryInStatus, og bliver derfor ikke tjekket, så det er korrekt at rækken skal slettes, men de 3 ider der mangler kommer slet ikke med derind for at blive tjekket, altså
for ( int i=0; i < employedIDsDS.Tables[0].Rows.Count; i++) { employeeID = (int)employedIDsDS.Tables[0].Rows[i]["EmployeeID"]; skifter fra 16, til 15 til 14 til 13 og så kører den videre. Det er index nr 3,5,7 i rækken der forsvinder
Jeg fandt ud af det. Når en række fjernes bliver også index fjernet og alle de næste række får derved nyt index. Så derfor kaldes efter forløkken acceptchanges på datasettet og ikke hver række, samtidigt skal man putte eller medarbjder id over i en arraylisten som der køres igennem med for løkken, derved bliver alle id der, isteder for de bliver fjernet ved metoden delete.
Synes godt om
Ny brugerNybegynder
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.