foreach (Control Cntrl in this.Controls)

Status
Niet open voor verdere reacties.

HelpElec

Gebruiker
Lid geworden
6 mrt 2013
Berichten
102
Beste allemaal,

Ik wil een reeks textboxen automatisch laten invullen door een List. De textboxen moeten logische namen hebbe, het is dus niet mogelijk om een array van Textbox te maken. Nu heb ik het volgende:

Code:
for (int i = 0; i < List.Count; i++)
{
    foreach (Control Cntrl in this.Controls)
    {
         if (Cntrl is TextBox)
         {
               //Handeling
          }
          else
          {
                foreach (Control SubCntrl in Cntrl.Controls)
                {
                      if (SubCntrl is TextBox)
                      {
                            //Handeling
                      }
                      else
                      {
                             foreach (Control SubSubCntrl in SubCntrl.Controls)
                             {
                                   if (SubSubCntrl is TextBox)
                                   {
                                                //Handeling
                                    }
                             }
                      }
              }
       }
}

Dit werkt, omdat ik bijvoorbeeld Textboxen in Groupboxen op Panels heb staan. Maar eerlijk gezegd vind ik het er niet uitzien. Weet iemand een functie dat je foreach echt kunt uitvoeren voor alle componenten die in de Designer van je Form staan?

Hartelijk dank!
 
HelpElec,

Na wat zoekwerk hier misschien een optie?

Code:
 if you have multiple panels and other user controls on it then use create following function.


        private void RecursivelyFormat(Control c)
            {
                  for(int x = 0; x < c.Controls.Count; x++)
                  {
                        if(c.Controls.Count > 0)
                        {
                              RecursivelyFormatForWinXP(c.Controls[x]);
                        }
                  }
           
 
                  if ( c.GetType()   == "System.Windows.Forms.Textbox"))
                  {
                        // your code goes here
   
                  }
            }
 
You can call it like this

private void btnSend_Click(object sender, System.EventArgs e)

        {
            for (int x = 0; x < this.Controls.Count; x++)
            {
                RecursivelyFormat(this.Controls[x]);
            }
        }

Bron: http://social.msdn.microsoft.com/fo...e/thread/db55a8dc-5c1c-4831-af1f-a7016d42970c
Succes!
 
Hier nog iets gevonden, dit is misschien nog beter:

Bron: http://odetocode.com/articles/71.aspx

Code:
private void Page_Load(object sender, System.EventArgs e)
{
    LoopTextboxes(Page.Controls);
}

private void LoopTextboxes(ControlCollection controlCollection)
{
    foreach(Control control in controlCollection)
    {
        if(control is TextBox)
        {
            ((TextBox)control).Text = "I am a textbox";
        }

        if(control.Controls != null)
        {
            LoopTextboxes(control.Controls);
        }
    }
}
 
Gek, die eerste reactie lijkt niet te kunnen... Maar op zo'n soort manier loopen is wel een oplossing. Beter dan wat ik heb. Gek dat het niet gewoon mogelijk is om alle controls van een Form aan te roepen.
Bedankt!!
 
Ik heb het onderste voorbeeld overgenomen, bedankt!
 
Laatst bewerkt:
In dat eerste voorbeeld gebeurt alles bij controls van controls die op je form staan, maar niet bij die controls zelf.
Het tweede voorbeeld is ook zoals ik het zou doen, ligt een beetje aan de situatie. (het extra casten naar een textbox hoeft niet want een 'Control' heeft een .Text property)


Dat je het niet in een keer kunt doen is simpel weg dat een textbox in een panel een control van het panel is, niet van het form. Dit is te vergelijken met bestanden in een map en alles wat daar weer in een map staat.
 
Casten is inderdaad niet nodig had ik ook gezien. Logisch ja, alleen ik dacht misschien is er wel een "ComponentControls" ofzo.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan