2013-05-08 3 views
0

Я пытаюсь найти, какое текстовое поле я ввел информацию в форму, и оставил все текстовые поля в форме затушеванной и заблокированной, чтобы в них не было введено никакой информации.Groupbox foreach не находит все текстовые поля

Проблема в том, что я запускаю код и отлаживаю. Кажется, я не нахожу все текстовые поля, которые находятся в форме при прохождении через них.

Я попытался изменить некоторую информацию в foreach, пытаясь найти, если groupbox name.equals и если элементы в групповом поле равны тексту. Я предполагаю, что ошибся с заявлениями 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) 
     { 

     ...... 

Второй Еогеасп должен работать над штурвалом GroupBox не раз на this.Controls.
Конечно, эти петли работают только для TextBoxes, содержащихся в GroupBox. Если у вас есть TextBox за пределами любого GroupBox, этот код их не найдет -

Однако зачем нужен цикл?
Вы можешь изменить конечное число текстовых полей, так что вы можете просто получить доступ к текстовым полям непосредственно

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

Похоже, что вы хотите перебрать штурвал GroupBox:

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

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

В WPF Я: используя следующую процедуру, чтобы получить все элементы управления 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, а не управление в вашем GroupBox

Однако, цикл представляется излишним, так как вы напрямую получить доступ к каждому Textbox по имени. Я бы, возможно, попробовать что-то вроде этого:

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 список пусто. В качестве альтернативы вместо добавления их в список вы можете просто отключить их/включить их прямо там.

Надеюсь, что это поможет