2013-05-08 50 views
0

我想找到哪個文本框,我已經輸入信息到一個窗體上,並使窗體內的其餘文本框消隱和鎖定,因此沒有信息可以輸入到他們。Groupbox foreach沒有找到所有文本框

問題是當我運行代碼和調試。在循環播放時,我似乎沒有找到表單上的所有文本框。

我試圖通過嘗試查找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; 
           } 
          } 
         } 
        } 
      } 

回答

6

。在你的環路初始化

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

     ...... 

第二的foreach應this.Controls在組合框中的控制工作,不會再簡單的錯誤。
當然,這些循環僅適用於包含在GroupBox中的文本框。如果你在任何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 
0

看來,您想通過分組框中的控件進行迭代:

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

       foreach (Control T in C.Controls) // loop GroupBox controls 
       ... 
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; } 
} 
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列表中未禁用任何:我想也許嘗試這樣的事情是空的。或者,不要將它們添加到列表中,您可以將它們禁用/啓用它們。

希望這會有所幫助