2012-06-07 3 views
0

У меня есть пара обычных Windows Forms. Для того, чтобы очистить поля ввода данных в одном из них я использую код что-то вроде этого:некоторые элементы управления формой окна не распознаются?

ClearInputFields(this); 

    private void ClearInputFields(Control Page) 
    { 
     try 
     { 
      foreach (Control ctrl in Page.Controls) 
      { 
       if (ctrl is Button)      
        continue; 
       if (ctrl is DataGridView) 
        continue; 
       if (ctrl is ListBox) 
        continue; 

       if (ctrl is TextBox) 
       { 
        ((TextBox)(ctrl)).Text = string.Empty; 
       } 
       else if (ctrl is ComboBox) 
       {   
        ((ComboBox)(ctrl)).SelectedIndex = 0; 
       } 
       else if (ctrl is CheckBox) 
       { 
        ((CheckBox)(ctrl)).Checked = false; 
       } 
       else if (ctrl.Controls.Count > 0) 
       { 
        ClearInputFields(ctrl); 
       }          
      } 
     } 
     catch (Exception ex) 
     { 
      TraceFile.Error("ExceptionLog", ex); 
     } 
    } 

На одной из форм он работает, как ожидалось. На другой форме два из девяти ComboBox не сбрасываются, и ни одна из шести CheckBoxes не очищается.

Пройдя через отладчик, кажется, что отдельные элементы управления даже не входят в список элементов управления, содержащихся в форме.?!

Я сравнил формы и не вижу ничего другого в свойствах этих элементов управления. Один из comboBoxes, который не распознается, является привязкой к базе данных, один - нет, но это также верно в случае сбрасываемых.

Я рассмотрел конструктора, и все элементы управления объявлены как «this.Controls.Add (this.name_of_control);»

Я пробовал оставить последнее «еще если» (в любом случае на этой форме нет панелей, групповых ящиков или других контейнеров). Никакой разницы в поведении.

Если я явно устанавливаю флажки в «Проверено = ложь» и устанавливаю ComboBoxes в «SelectedIndex = 0», они делают то, что я ожидаю, но не при повторении с помощью элементов управления формы.

EDIT - добавление: все элементы управления создаются в Дизайнере, а не во время выполнения. Как уже упоминалось, на форме нет контейнеров.

Я ожидаю, что это один из тех простых, очевидных, прямо под ваши проблемы с носом, но до сих пор я этого не вижу.

Любое понимание оценено. Благодаря!

+0

Создаете ли вы какой-либо элемент управления во время выполнения? Сравнить _Page.Controls.Count_ –

+0

Есть ли у вас другие элементы управления внутри элементов управления? Возможно, вам придется иметь логику, которая ищет содержащийся элемент управления, а затем повторяет передачу его контейнера. –

+1

@SASS_Shooter Код уже делает это. Это рекурсивно. – LarsTech

ответ

0

Возможно, при изменении свойства элемента управления - порядок элементов управления в this.Controls изменяется, поэтому вы не проходите через все элементы управления. Хотя, возможно, это не так, потому что, возможно, Control ctrl in Page.Controls проверяется только в первый раз.

+0

Изменение порядка элементов управления при установке свойства одного из них, несомненно, объяснит поведение, поэтому я попытался использовать отдельные циклы (хотя это может не гарантировать, что порядок не был изменен). И кроме «немой удачи», это не объясняет, почему оно работает в другой форме. И, конечно, логическая конечная точка этой логики заключается в том, что вы * должны * устанавливать каждый элемент управления индивидуально. – mickeyf

0

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

ClearInputFields(this); 

private List<Control> ControlsForPage(Control Page) 
{ 
     List<Control> result = new List<Control>(); 
     foreach (Control ctrl in Page.Controls) 
       result.Add(ctrl); 
     return result; 
{ 

private void ClearInputFields(Control Page) 
{ 
    try 
    { 
     List<Control> ctrlsCopy = ControlsForPage(Page); 
     foreach (Control ctrl in ctrlsCopy) 
     { 
      if (ctrl is Button)      
       continue; 
      if (ctrl is DataGridView) 
       continue; 
      if (ctrl is ListBox) 
       continue; 

      if (ctrl is TextBox) 
      { 
       ((TextBox)(ctrl)).Text = string.Empty; 
      } 
      else if (ctrl is ComboBox) 
      {   
       ((ComboBox)(ctrl)).SelectedIndex = 0; 
      } 
      else if (ctrl is CheckBox) 
      { 
       ((CheckBox)(ctrl)).Checked = false; 
      } 
      else if (ctrl.Controls.Count > 0) 
      { 
       ClearInputFields(ctrl); 
      }          
     } 
    } 
    catch (Exception ex) 
    { 
     TraceFile.Error("ExceptionLog", ex); 
    } 
} 

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

+0

Надеюсь, что то, что я делаю с каждым элементом, фактически не изменяет коллекцию, но это хорошее предложение. Я попробую это, когда вернусь к работе в понедельник. Благодаря! – mickeyf

+0

Это не имело никакого эффекта и, думая об этом, я не знаю, почему это было бы - если я не пропущу что-то. Если я сделаю фактическую копию каждого элемента управления, я очищу свои копии, а не контроль над формой. Если я копирую ссылки на каждый элемент управления, это должно вести себя так, как будто я просто работаю на исходных элементах управления (что и есть). – mickeyf

+0

Я не думал, что коллекция изменится, просто заказ –

Смежные вопросы