Groupbox foreach找不到所有文本框

时间:2013-05-08 16:05:10

标签: c# winforms

我正在尝试找到我在表单上输入信息的文本框,并使表单中的其余文本框变空并锁定,以便不能输入任何信息。

问题是当我运行代码并调试时。在循环浏览时,我似乎没有找到表单上的所有文本框。

我试图通过尝试查找groupbox name.equals以及groupbox中的项目是否等于文本来尝试更改foreach中的一些信息。我假设我在foreach语句中犯了错误。

以下是我的代码。

 foreach (Control C in this.Controls)
            {
                if (C is GroupBox)

                    foreach (Control T in this.Controls)
                    {
                        if (T is TextBox)
                        {
                            {
                                if (T.Text != string.Empty && T.Name.Equals("txtlotno"))
                                {
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }

                                else if (T.Text != string.Empty && T.Name.Equals("txtvingot"))
                                {
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }
                                else if (T.Text != string.Empty && T.Name.Equals("txtheads"))
                                {
                                    txtvingot.Enabled = false;
                                    txtvingot.BackColor = Color.LightGray;
                                    txtlotno.Enabled = false;
                                    txtlotno.BackColor = Color.LightGray;
                                    GroupBoxIngot.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }
                                else if (T.Text != string.Empty && T.Name.Equals("txtrisersgood"))
                                {
                                    txtvingot.Enabled = false;
                                    txtvingot.BackColor = Color.LightGray;
                                    txtlotno.Enabled = false;
                                    txtlotno.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxIngot.BackColor = Color.LightSlateGray;
                                }
                            }
                        }
                    }
            }

4 个答案:

答案 0 :(得分:6)

循环初始化中存在一个简单的错误

foreach (Control C in this.Controls)
{
     if (C is GroupBox)
     {
        foreach (Control T in C.Controls)
        {

         ......

第二个foreach应该不再在this.Controls上处理对groupbox的控制 当然,这些循环仅适用于GroupBox中包含的TextBox。如果你有任何GroupBox之外的TextBox,这段代码将无法找到它们 -

但是,为什么需要循环?
您更改了有限数量的文本框,因此您可以直接访问文本框

 if (txtlotno.Text != string.Empty)
 {
     txtheads.Enabled = false;
     txtheads.BackColor = Color.LightGray;
     GroupBoxHeads.BackColor = Color.LightSlateGray;
     txtrisersgood.Enabled = false;
     txtrisersgood.BackColor = Color.LightGray;
     GroupBoxRisers.BackColor = Color.LightSlateGray;
 }
 .... and so on the the other three

答案 1 :(得分:1)

您的问题似乎是您正在遍历this.Controls而不是组框中的控件

但是,循环似乎是多余的,因为您可以按名称直接访问每个文本框。我想尝试这样的事情:

List<TextBox> _disable = new List<TextBox>(); 
List<TextBox _enable = new List<TextBox>(); 

// Gather Textboxes to be disabled and enabled 
foreach(Control c in this.Controls)
{
    GroupBox group = c as GroupBox; 
    if(group == null ) // Not a group box so continue on 
        continue; 
    foreach(Control c in group.Controls)
    {
        TextBox tb = c as TextBox; 
        if(tb == null )
           continue; // Not a textbox so continue on 

        if(!String.IsNullOrWhitespace(tb.Text)) // We have information so add to _enable
           _enable.Add(tb); 
        else 
           _disable.Add(tb); // empty textbox so ... disable 
    }
}

// Enable or Disable Textboxes 
foreach(TextBox tb in _enable)
{
   tb.Enabled = true; 
   tb.BackColor = Colors.White
}

foreach(TextBox tb in _disable)
{
   tb.Enabled = false; 
   tb.BackColor = Colors.LightGrey 
}

此方法允许您遍历所有组框,遍历所有文本框并组织每个文本框并一起启用/禁用它们,或者如果_enable列表为空则不禁用任何文本框。或者,您可以在此处禁用它们/启用它们,而不是将它们添加到列表中。

希望这有帮助

答案 2 :(得分:0)

您似乎想要遍历GroupBox的控件:

foreach (Control C in this.Controls)
        {
            if (C is GroupBox)

                foreach (Control T in C.Controls) // loop GroupBox controls
                ...

答案 3 :(得分:0)

在WPF中,我使用以下过程来获取主Grid及其嵌套容器中的所有TextBox控件。同样的方法也适用于你的情况。

private List<TextBox> GetTB(Grid Grd)
{
    List<TextBox> _lstT = new List<TextBox>();
    try
    {
        // get ALL TextBox in main Grid and sub Grid/UniformGrid
        UIElementCollection _mainGrd = Grd.Children;
        foreach (UIElement el in _mainGrd)
        {
            if (el is TextBox) { _lstT.Add((TextBox)el); }
            else if (el is Grid)
            {
                foreach (UIElement el1 in ((Grid)el).Children)
                { if (el1 is TextBox) { _lstT.Add((TextBox)el1); } }
            }
            else if (el is UniformGrid)
            {
                foreach (UIElement el1 in ((UniformGrid)el).Children)
                { if (el1 is TextBox) { _lstT.Add((TextBox)el1); } }
            }
        }
        return _lstT;
    }
    catch { throw; }
}