循环文本框

时间:2011-02-01 13:20:16

标签: c# .net winforms textbox

我有一个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,我必须遍历主控件(面板),然后遍历面板上的控件。它开始变得复杂。

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

12 个答案:

答案 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)

由于您已经知道控件的名称,因此您可以按名称搜索控件。

请参阅Get a Windows Forms control by name in C#

答案 10 :(得分:0)

您可以创建Dictionary TextBoxint,如下所示

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(其中,对我来说,只返回第一级子控件)非常相似,但不同于我认为自己的答案我认为