我有一个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,我必须遍历主控件(面板),然后遍历面板上的控件。它开始变得复杂。
有关如何将此值分配给文本框的任何建议?
答案 0 :(得分:37)
要以递归方式获取指定类型的所有控件和子控件,请使用以下扩展方法:
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 = ...;
}
答案 1 :(得分:6)
你可以循环表格中的所有控件,如果它是一个“文本框”则逐一询问它们是否返回它们的完整列表。
public List GetTextBoxes(){
var textBoxes = new List();
foreach (Control c in Controls){
if(c is TextBox){
textBoxes.add(c);
}
}
return textBoxes;
}
答案 2 :(得分:4)
您可以以相当简单的方式遍历表单中的文本框:
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解决方案那样优雅:)
答案 3 :(得分:2)
遍历表单中的控件并检查控件的名称(如果匹配),然后根据需要设置Text属性。
int i = 0;
foreach (Control contrl in this.Controls) {
if (contrl.Name == ("DateTextBox" + i.ToString())) {
contrl.Text = "requiredtexttobeset";
}
i = i + 1;
}
答案 4 :(得分:2)
由于这篇文章似乎不时会自我复活,并且因为上面的解决方案在控件内部找不到控件,例如在组框中,所以会找到它们。只需添加您的控件类型:
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
}
答案 5 :(得分: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();
}
}
答案 6 :(得分:1)
//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;
}
}
}
答案 7 :(得分:1)
你可以简单地做这个伴侣......
foreach (TextBox txt in this.Panel.Controls.OfType<TextBox>())
{
txt.Text="some value you assign";
}
如果您的文本框直接在表单上,而不是在Panel上,那么您可以将this.Panel.Controls
替换为this.Controls
。这对你来说应该简短明了。
答案 8 :(得分:0)
在InitialiseComponents()
调用之后,将文本框添加到表单上的集合成员变量中。然后,您可以稍后按顺序遍历它们。
答案 9 :(得分:0)
由于您已经知道控件的名称,因此您可以按名称搜索控件。
答案 10 :(得分:0)
您可以创建Dictionary
TextBox
,int
,如下所示
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...
祝你好运!
答案 11 :(得分:0)
其他答案只是没有为你剪掉它?
我发现这是对SO的类似问题的答案,但我现在找不到该主题。它以递归方式循环遍历位于type
内的给定control
的所有控件。所以包括......等孩子的孩子的孩子。我的例子将每个ForeColor
的{{1}}改为粉红色!
TextBox
实施:
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);
}
与abatishchev's answer(其中,对我来说,只返回第一级子控件)非常相似,但不同于我认为自己的答案我认为