Avatar billede fastpoint Nybegynder
19. februar 2007 - 14:06 Der er 12 kommentarer og
1 løsning

loope controls

Hvordan looper jeg CheckBox controls fra min codebehind fil?
foreach(CheckBox check in this.Page.Controls)
laver cast exception
Avatar billede fastpoint Nybegynder
19. februar 2007 - 14:09 #1
this.FindControl kan ikke benyttes da der er flere checkbox'es og jeg kender heller ikke deres id.
Avatar billede fastpoint Nybegynder
19. februar 2007 - 14:30 #2
samme fejl med denne           
foreach(CheckBox check in Placeholder.Controls){}

System.InvalidCastException: Specified cast is not valid.
Avatar billede dr_chaos Nybegynder
19. februar 2007 - 14:45 #3
foreach(Control c in Placeholder.Controls){
if(c.GetType()==typeof(CheckBox))
//gør noget
}
Avatar billede fastpoint Nybegynder
19. februar 2007 - 14:52 #4
kan man gøre det rekursivt?
problemet er at min placeholder indeholder kun et objekt som er et table.
og mit table indeholder mine checkbox elementer
Avatar billede dr_chaos Nybegynder
19. februar 2007 - 15:05 #5
måske sådan her:

public void test(Control p)
{
foreach(Control c in Placeholder.Controls){
if(c.GetType()==typeof(CheckBox))
{
//gør noget
}
else if(c.HasControls())
{
test(c);
}
}
}
Avatar billede fastpoint Nybegynder
19. februar 2007 - 15:25 #6
Det går helt galt:)
Den skal returnere en int, men jeg bliver forvirret i de rekursive kald.
Avatar billede fastpoint Nybegynder
19. februar 2007 - 15:28 #7
Det her virker ikke. Jeg kan ikke få den til at hoppe helt ud af det rekursive kald når den har fundet en checkbox som er checked.

    private int checkRecursive(Control elements)
        {
            int id = 0;
            foreach(Control checkbox in elements.Controls)
            {
                if(checkbox.GetType() == typeof(CheckBox))
                {
                    if(((CheckBox)checkbox).Checked)
                        id = Convert.ToInt32(((CheckBox)checkbox).ID);
                    continue;
                }
                else
                {
                    if(checkbox.HasControls())
                        id = checkRecursive(checkbox);
                }
            }
            return id;
           
        }
Avatar billede fastpoint Nybegynder
19. februar 2007 - 15:31 #8
ser ud til dette fungere, men kan du se om der kan opstå problemer i det?

    private int checkRecursive(Control elements)
        {
            int id = 0;
            foreach(Control checkbox in elements.Controls)
            {
                if(checkbox.GetType() == typeof(CheckBox))
                {
                    if(((CheckBox)checkbox).Checked)
                        id = Convert.ToInt32(((CheckBox)checkbox).ID);
                    continue;
                }
                else
                {
                    if(checkbox.HasControls() && id == 0)
                        id = checkRecursive(checkbox);
                }
            }
            return id;
           
        }
Avatar billede dr_chaos Nybegynder
19. februar 2007 - 15:36 #9
fjern continue;
PÅ den nuværende måde vil du kun få et resultat retur.
Lav et int array eller lignende og tilføj værdierne der til.
Avatar billede fastpoint Nybegynder
19. februar 2007 - 15:40 #10
men jeg skal kun have 1 værdi
mine checkbox'es fungere præcis som radiobuttons:)
der kan kun være én som er checked og derfor skal den bare returnere den.
Jeg satte også {} så continue kommer ind under if sætningen.

er det korrekt nok hvis det er hvad der ønskes?
Avatar billede dr_chaos Nybegynder
19. februar 2007 - 16:36 #11
Brug break:
private int checkRecursive(Control elements)
        {
            int id = 0;
            foreach(Control checkbox in elements.Controls)
            {
                if(checkbox.GetType() == typeof(CheckBox))
                {
                    if(((CheckBox)checkbox).Checked)
                        id = Convert.ToInt32(((CheckBox)checkbox).ID);
                    break;
                }
                else
                {
                    if(checkbox.HasControls() && id == 0)
                        id = checkRecursive(checkbox);
                }
            }
            return id;
         
        }

Ellers kan jeg ikke umiddelbart se nogen problemer.
Avatar billede kalp Novice
19. februar 2007 - 19:41 #12
Det var da en ikke særlig køn rekursiv metode:o)
Den er heller ikke særlig læsevenlig.
Det kan gøres på disse linjer!

private string checkRecursive(Control control)
{
  if (control is CheckBox && ((CheckBox)control).Checked) return control.ID;
  else{
    foreach (Control subControl in control.Controls){
    string id = checkRecursive(subControl);
      if (id != null) return id;
                        }
                  }
                  return null;
            }     

Du må undskylde opstillingen af paranteser, men eksperten ændre på min formattering.
Har desuden ændret lidt på navngivningen så det giver mere mening.
Ps. metoden returnere en string som du selvfølgelig convertere til en int hos modtager.
Jeg synes det er kønnere sådan der.
Avatar billede fastpoint Nybegynder
20. februar 2007 - 13:56 #13
super lækker kode!
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