10. oktober 2007 - 14:39Der er
15 kommentarer og 1 løsning
Behandle validationgroups én ad gangen.
I min HTMLtabel (egtl. et GridView) har jeg flere validatorer pr. række. Jeg har én knap som poster hele molevitten.
Hvis jeg nu tildeler validatorerne i hver række en Validationgroup på basis af rækkenummeret, så kunne jeg godt tænke mig at kunne gennemløbe hver række og spørge på, om den kan valideres eller ej (så jeg kan opdatere de rækker som validerer ok, og vise valideringsfejlen på de øvrige).
Jeg er med så langt, at jeg skal disable clientside validation, men hvordan får jeg lavet noget a la
for i = 0 to rows.count if validationgroup[i] is valid update row[i] else do nothing
Tjoh - jeg har et dataset i et gridview og det er data hentet fra en ekstern fil ,så har også en masse validering. Jeg tænkt på at brueg validatorer, men det blev simpelthen for komplekst.
Jeg gør derfor følgende: 1. Tiføjer en kolonne til datasettet (med header Status) 2. Har noget kode hvor jeg gennemløber alle rækkerne i gridview. Hvis jeg finder en fejl i en eller flere kolonner, så tilføjer jeg lidt tekst ril rækkens fejlmeddelelse. 3. Når færdig med rækken sætter jeg myDataRow.RowError= "min fejlmeddelelse", hvilket tillige sætter rækkens status myDataRow.HasErrors til True. Det bruger jeg efterfølgende til ikke at gemme de fejlbehæftede rækker.
Så kan jeg binder det hele til mit gridview og se evt fejl i de passende rækker.
... har du så nogen ide om, når jeg gør som nedenfor (kaldes via klik på "Gem"-knappen), hvorfor ValidatorCollection coll er tom? Er det fordi jeg har galt fat i noget med PageLifeCycle i forhold til, hvornår jeg sætter ValidationGroup på validatorerne (se ovenfor)?
Eftersom du har ViewState, så skulle ændringer i kontrollerne gerne genspejle sig der, så jeg mener ikke det er nogen life-cycle fælde. Men jeg har ingen idé om hvad der går galt hos dig.
Jeg droppede validatorerne fordi jeg alligevel havde så meget custom validering at det blev simpelthen simplere for mig. Og årsagen til at tilføje en ekstra søjle til dataset og gridview var netop for at slippe for selv at holde styr på hvilken række det var, da beskederne af sig selv dukker op ide "kriminelle" rækker.
Ok, jeg kan forstå at hvis man bruger BaseValidator.Validate, så kan man aflæse BaseValidator.IsValid.
Men der må vel være noget tilsvarende for, når man kalder Page.Validate(group)? Jeg tror jeg er på gale veje med nedenstående, hvor jeg tjekker på Page.IsValid. Der må vel findes noget "Page.GroupIsValid(group)" eller noget i den dur...
foreach (int row in GridView1.dirtyRows) { string group = "" + (row+1); Page.Validate(group); if (Page.IsValid) <-- Skal man kalde noget andet end Page.IsValid? {
ok, det ser ud til, at Page.Validate enten sætter Page.Valid=false eller også gør den det ikke. Dvs. hvis man først har fået én mislykket Page.Validate, så hænger man på Page.Valid=false. Så hvis der ikke er en måde at sætte Page.Valid=true...?
Det ville være ulogisk at kunne sætte page.IsValid=true fra koden. Det er brugeren som er kommet med noget "ulovligt", og det kan koden ikke rette på efterfølgende, men kun brugeren, i hht til de informative fejlbeskeder.
Ok, nu er jeg vist også kommet så langt jeg kan ad den den vej: Jeg lavede, som du foreslog, en rutine som tjekker validatorerne. Så smid et svar... Men nu har man så problemet med at få vist validatorernes fejlmeddelelser når man HAR trykket på knappen... Det kunne være rart hvis ValidationSummary bare virkede.
private bool ValidatorCollectionIsValid(ValidatorCollection col) { bool result = true; IEnumerator myEnumerator = col.GetEnumerator(); while (myEnumerator.MoveNext()) { BaseValidator val = (BaseValidator)myEnumerator.Current; val.Validate(); if (!val.IsValid) { result = false; } } return result; }
Når du nu looper igennem dem, så ved du hvilken er valid eller ej, så kunne du plukke de invalides fejlbesked op og selv smide den ud i en dataliste eller noget.
ja, det ender det nok med. Indtil videre har jeg da fået det til at virke, så jeg kan tjekke på række-basis. Tak.
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.