Bucle a través de cuadros de texto

Tengo una aplicación de winforms que tiene 37 cuadros de texto en la pantalla. Cada uno está numerado secuencialmente:

DateTextBox0 DateTextBox1 ... DateTextBox37 

Estoy tratando de recorrer los cuadros de texto y asignar un valor a cada uno:

 int month = MonthYearPicker.Value.Month; int year = MonthYearPicker.Value.Year; int numberOfDays = DateTime.DaysInMonth(year, month); m_MonthStartDate = new DateTime(year, month, 1); m_MonthEndDate = new DateTime(year, month, numberOfDays); DayOfWeek monthStartDayOfWeek = m_MonthStartDate.DayOfWeek; int daysOffset = Math.Abs(DayOfWeek.Sunday - monthStartDayOfWeek); for (int i = 0; i <= (numberOfDays - 1); i++) { //Here is where I want to loop through the textboxes and assign values based on the 'i' value DateTextBox(daysOffset + i) = m_MonthStartDate.AddDays(i).Day.ToString(); } 

Permítanme aclarar que estos cuadros de texto aparecen en paneles separados (37 de ellos). Entonces, para que pueda recorrer usando un foreach, tengo que pasar por los controles primarios (los paneles), luego recorrer los controles en los paneles. Comienza a complicarse.

¿Alguna sugerencia sobre cómo puedo asignar este valor al cuadro de texto?

Para obtener todos los controles y subcontroles recursivamente del tipo especificado, use este método de extensión:

 public static IEnumerable GetChildControls(this Control control) where TControl : Control { var children = (control.Controls != null) ? control.Controls.OfType() : Enumerable.Empty(); return children.SelectMany(c => GetChildControls(c)).Concat(children); } 

uso:

 var allTextBoxes = this.GetChildControls(); foreach (TextBox tb in allTextBoxes) { tb.Text = ...; } 

Puede recorrer todos los controles en el formulario preguntando uno por uno si es un “Cuadro de texto” y luego devolver la Lista completa de ellos.

 public List GetTextBoxes(){ var textBoxes = new List(); foreach (Control c in Controls){ if(c is TextBox){ textBoxes.add(c); } } return textBoxes; } 

Puede recorrer los cuadros de texto en su formulario de una manera bastante simple:

 Func> SearchTextBoxes = null; SearchTextBoxes = coll => { List textBoxes = new List(); foreach (Control c in coll) { TextBox box = c as TextBox; if (box != null) textBoxes.Add(box); if (c.Controls.Count > 0) textBoxes.AddRange(SearchTextBoxes(c.Controls)); } return textBoxes; }; var tbs = SearchTextBoxes(this.Controls).OrderBy(tb => tb.Name); 

Editar: Modificado según nuevos requisitos. No es tan elegante como la solución LINQ, por supuesto 🙂

Iterar a través de los controles dentro del formulario y verificar el nombre del control si coincide, luego establecer la propiedad de texto como lo requiera.

 int i = 0; foreach (Control contrl in this.Controls) { if (contrl.Name == ("DateTextBox" + i.ToString())) { contrl.Text = "requiredtexttobeset"; } i = i + 1; } 

Dado que esta publicación parece resucitarse de vez en cuando y dado que las soluciones anteriores no encuentran controles dentro de los controles, como en un cuadro de grupo, esto los encontrará. Simplemente agregue su tipo de control:

  public static IList GetAllControls(Control control) where T : Control { var lst = new List(); foreach (Control item in control.Controls) { var ctr = item as T; if (ctr != null) lst.Add(ctr); else lst.AddRange(GetAllControls(item)); } return lst; } 

Y es uso:

  var listBoxes = GetAllControls(this); foreach (ListBox lst in listBoxes) { //Do Something } 

Si quieres prescindir de ‘foreach’ (si tienes cuadros específicos para ajustar / dirección)

 int numControls = Page.Form.Controls.Count; for (int i = 0; i < numControls; i++) { if (Page.Form.Controls[i] is TextBox) { TextBox currBox = Page.Form.Controls[i] as TextBox; currbox.Text = currbox.TabIndex.ToString(); } } 
  //THE EASY WAY! Always post easy solutions. It's the best way. //This code is used to loop through all textboxes on a form for data validation. //If an empty textbox is found, Set the error provider for the appropriate textbox. foreach (var control in Controls) { if (control is TextBox) { //Box the control into a textbox. Not really needed, but do it anyway var textbox = (TextBox)control; if (String.IsNullOrWhiteSpace(textbox.Text)) { //Set the errorProvider for data validation errorProvider1.SetError(textbox, "Data Required!"); textbox.Text = String.Empty; //Clear out the whitespace if necessary //blnError = true; } } } 

Simplemente puede hacer esto mate …

 foreach (TextBox txt in this.Panel.Controls.OfType()) { txt.Text="some value you assign"; } 

Si sus cuadros de texto están en el formulario directamente y no en un Panel, puede reemplazar this.Controls . this.Panel.Controls con this.Controls . this.Controls . Eso debería ser lo suficientemente breve y claro para ti.

Después de la llamada a InitialiseComponents() , agregue los cuadros de texto a una variable de miembro de colección en el formulario. A continuación, puede iterar a través de ellos en orden más adelante.

Puede crear un Dictionary of TextBox , int como el siguiente

 Dictionary textBoxes = new Dictionary(); foreach (TextBox control in Controls.OfType()) textBoxes[control] = Convert.ToInt32(control.Name.Substring(11)); 

Ahora … para recorrerlos …

 foreach (var item in textBoxes.Select(p => new { textBox = p.Key, no = p.Value})) item.textBox.Text = item.no.ToString(); // whatever you want... 

¡Buena suerte!

Como ya conoce el nombre de control, puede buscar el control por su nombre.

Consulte Obtener un control de Windows Forms por nombre en C #

¿Otras respuestas simplemente no te están cortando?
Encontré esto como una respuesta a una pregunta similar en SO, pero ahora no puedo encontrar el hilo. Recursivamente recorre TODOS los controles de un type dado que se encuentran dentro de un control . Así que incluye hijos de hijos de hijos de … etc. ¡Mi ejemplo cambia el ForeColor de cada TextBox a Hot Pink!

 public IEnumerable GetAllControlsOfType(Control control, Type type) { var controls = control.Controls.Cast(); return controls.SelectMany(ctrl => GetAllControlsOfType(ctrl, type)) .Concat(controls) .Where(c => c.GetType() == type); } 

Implementación:

 IEnumerable allTxtBxs = GetAllControlsOfType(this, typeof(TextBox)); foreach (TextBox txtBx in allTxtBxs) { txtBx.ForeColor = Color.HotPink; } 

Muy similar a la respuesta de abatishchev (que, para mí , solo devolvió controles secundarios de primer nivel ), pero lo suficientemente diferente como para merecer su propia respuesta, creo.