通过文本框循环

我有一个Winforms应用程序,在屏幕上有37个文本框。 每一个都按顺序编号:

DateTextBox0 DateTextBox1 ... DateTextBox37 

我正在尝试迭代文本框并为每个文本框分配一个值:

 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(); } 

让我澄清这些文本框出现在单独的面板(其中37)。 所以为了让我循环使用foreach,我必须遍历主控件(面板),然后循环通过面板上的控件。 它开始变得复杂。

有关如何将此值分配给文本框的任何build议?

要recursion指定types的所有控件和子控件,请使用以下扩展方法:

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

用法:

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

如果它是“文本框”,你可以循环表单中的所有控件,然后返回它们的完整列表。

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

您可以通过相当简单的方式遍历表单中的文本框:

 Func<ControlCollection, List<TextBox>> SearchTextBoxes = null; SearchTextBoxes = coll => { List<TextBox> textBoxes = new List<TextBox>(); 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); 

编辑:根据新的要求更改。 当然,几乎不像LINQ解决scheme那样高雅:)

迭代表单中的控件,检查控件的名称(如果匹配),然后根据需要设置Text属性。

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

如果你想不做'foreach'(如果你有特定的盒子来调整/地址)

 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; } } } 

由于这篇文章似乎不时复活自己,因为上面的解决scheme找不到控件内的控件,如在一个groupbox,这将find它们。 只需添加您的控制types:

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

这是使用:

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

你可以简单地做这个伙计…

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

如果你的文本框直接在窗体上,而不是在面板上,那么你可以用this.Controlsreplacethis.Panel.Controls 。 对于你来说,这应该是简短而明确的。

InitialiseComponents()调用后,将文本框添加到窗体上的集合成员variables。 然后,您可以稍后再遍历它们。

你可以像下面这样创build一个TextBox Dictionary

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

现在..通过他们循环..

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

祝你好运!

由于您已经知道控件的名称,因此您可以通过名称来search控件。

请参阅在C#中按名称获取Windows窗体控件

其他答案只是不为你削减?
我发现这是一个类似的问题上的答案,但我现在找不到线程。 它recursion地循环通过位于控件内的给定type所有控件。 所以包括孩子的孩子…等我的例子改变每个TextBoxForeColor到热粉红色!

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

执行:

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

与abatishchev的回答非常相似( 对于我来说 , 这个回答只是返回了一级儿童控制),但是我认为这个回答是不同的,值得我自己回答。