Avatar billede speedpete Nybegynder
10. oktober 2007 - 14:39 Der 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
Avatar billede dr_chaos Nybegynder
10. oktober 2007 - 14:53 #1
på selve siden kan du kalde Page.Validate("validationgroupid").
Det er muligvis den eneste måde.
Avatar billede speedpete Nybegynder
10. oktober 2007 - 15:02 #2
Ok, det kigger jeg på.
Avatar billede neoman Novice
10. oktober 2007 - 15:21 #3
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.

Måske kan du bruge ideen.


misbruger det underliggende datasets
Avatar billede speedpete Nybegynder
10. oktober 2007 - 15:49 #4
Ja, det er muligt; jeg vil lige prøve validationvejen lidt endnu. Du kender ikke nogle gode links?

Jeg er foreløbig kommet til:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType==DataControlRowType.DataRow)
        {
            DatoValidator dato = (DatoValidator)e.Row.FindControl("DatoValidatorEditDato");
            dato.EnableClientScript = false;
            dato.ValidationGroup = "" + e.Row.RowIndex;
            .
            .
            .

private void SaveModifiedRows()
{
      foreach (int row in GridView1.dirtyRows)
      {
                Page.Validate(""+row);               
                if (Page.IsValid)
                {                   
                  // indsæt række nr [row]

.... men det ser ikke ud til at Page.Validate(""+row) får fat i nogen validationgroup, eller også er der noget andet i vejen...
Avatar billede neoman Novice
10. oktober 2007 - 16:08 #5
du kunne evt validere dem hver for sig:

minValidator.Validate og så If minValidator.IsValid Then ' gør et eller andet.

pg man kan få en liste af validatorer i en gruppe vha.PageGetValidators(ValidationGroup)
Avatar billede speedpete Nybegynder
11. oktober 2007 - 08:44 #6
... 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)?

Eller var det her du droppede validatorerne?

private void SaveModifiedRows()
    {
        try
        {
            foreach (int row in GridView1.dirtyRows)
            {
                Page.Validate(""+row);
                ValidatorCollection coll = Page.GetValidators("" + row);
                if (Page.IsValid)
                {
Avatar billede neoman Novice
11. oktober 2007 - 11:12 #7
ingen idé :(.

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.
Avatar billede speedpete Nybegynder
11. oktober 2007 - 11:33 #8
Det var åbenbart noget banal streng-konvertering. Nu kan jeg se at ValidatorCollection indeholder det antal validatorer, som jeg regner med.

Har du så nogen ide om, hvordan man så tjekker om den givne validationgroup validerer ok?

foreach (int row in GridView1.dirtyRows)
            {
                string group = "" + (row+1);
                Page.Validate(group);
                DatoValidator val = (DatoValidator)GridView1.Rows[row].FindControl("DatoValidatorEditDato");
                String valgrp = val.ValidationGroup;
                ValidatorCollection coll = Page.GetValidators(group);
                if (Page.IsValid)
Avatar billede neoman Novice
11. oktober 2007 - 11:52 #9
hvis Page.validate(group)stadig ikke virker  så vel loope på medlemmerne og checke  som i 10/10-2007 16:08:20
Avatar billede speedpete Nybegynder
11. oktober 2007 - 12:28 #10
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?
                {
Avatar billede neoman Novice
11. oktober 2007 - 12:39 #11
http://weblogs.asp.net/rajbk/archive/2007/03/15/page-isvalid-and-validate.aspx

Interessant spørgsmål - jeg kan også selv fare vild i den logik. Der gemmer sig måske nogle guldkorn i eksempel softwaren i denne artikel: http://aspnet.4guysfromrolla.com/articles/112305-1.aspx
Avatar billede speedpete Nybegynder
11. oktober 2007 - 13:19 #12
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...?
Avatar billede neoman Novice
11. oktober 2007 - 13:28 #13
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.
Avatar billede speedpete Nybegynder
11. oktober 2007 - 14:00 #14
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;
    }
Avatar billede neoman Novice
11. oktober 2007 - 14:10 #15
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.
Avatar billede speedpete Nybegynder
11. oktober 2007 - 15:04 #16
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.
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