2011-01-26 2 views
18
private void CleanForm() 
{ 
    foreach (var c in this.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 
    } 
} 

Этот метод не работает, и элементы управления не очищаются. Он компилируется отлично, но ничего не делает.Как очистить текст всех текстовых полей в форме?

Любые идеи?

+2

Как в стороне, вы можете указать 'TextBoxBase' вместо' TextBox'; который будет автоматически включать многострочные текстовые поля, богатые текстовые поля и т. д. тоже. – Timwi

+1

Также вам не нужно бросать в 'TextBox'. – SLaks

+0

Этот код работает как есть, но убедитесь, что в каждом из операторов (this.Controls) есть фактический элемент управления, который имеет текстовые поля. Например, если у вас есть форма, с таблицейLayoutPanel и текстовыми полями все в таблицеLayoutPanel, foreach (var c в этом.Controls) не будет работать, он должен быть foreach (var c в tableLayoutPanel1.Controls). – Hammy

ответ

4

Ваши текстовые поля, вероятно, находятся внутри панелей или других контейнеров, а не непосредственно внутри формы.

Вам необходимо рекурсивно пройтись по коллекции Controls каждого дочернего элемента управления.

+0

Они находятся внутри GroupBoxes. Каким будет лучший курс действий? –

+0

@sergio: Вам нужно сделать свою функцию рекурсивной. – SLaks

6

У нас была проблема, как это за несколько недель до этого. Если вы установили точку останова и углубились в this.Controls, проблема обнаруживает ее природу: вы должны пройти через все дочерние элементы управления.

Код может выглядеть следующим образом:

private void CleanForm() 
{ 
    traverseControlsAndSetTextEmpty(this); 
} 
private void traverseControlsAndSetTextEmpty(Control control) 
{ 

    foreach(var c in control.Controls) 
    { 
     if (c is TextBox) ((TextBox)c).Text = String.Empty; 
     traverseControlsAndSetTextEmpty(c); 
    } 
} 
4
private void CleanForm(Control ctrl) 
{ 
    foreach (var c in ctrl.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 

     if(c.Controls.Count > 0) 
     { 
      CleanForm(c); 
     } 
    } 
} 

Когда вы изначально называют ClearForm, проходят в этом, или Page (я предполагаю, что это то, что 'это' есть).

57

Мне нравится лямбда :)

private void ClearTextBoxes() 
{ 
    Action<Control.ControlCollection> func = null; 

    func = (controls) => 
     { 
      foreach (Control control in controls) 
       if (control is TextBox) 
        (control as TextBox).Clear(); 
       else 
        func(control.Controls); 
     }; 

    func(Controls); 
} 

Успехов!

+2

хороший образец кода! – TheGeekYouNeed

+0

Не работайте для меня. :( –

+0

@Alexbelek, какая версия точечной сети вы используете? – Homam

2

И это для очистки всех элементов управления в форме, как текстовое поле, флажок, RadioButton

вы можете добавить различные типы вы хотите ..

private void ClearTextBoxes(Control control) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (c is TextBox) 
      { 
       ((TextBox)c).Clear(); 
      } 

      if (c.HasChildren) 
      { 
       ClearTextBoxes(c); 
      } 


      if (c is CheckBox) 
      { 

       ((CheckBox)c).Checked = false; 
      } 

      if (c is RadioButton) 
      { 
       ((RadioButton)c).Checked = false; 
      } 
     } 
    } 
+0

Кажется здоровым, но как его реализовать? – Nuno

+0

@Nuno только вам нужно вызывать форму метода отправляется или сохраняется с передающим объектом управления –

-1

Просто используйте

private void button2_Click(object sender, EventArgs e) 
    { 

     textBox1.Text = ""; 
    } 
0

Попробуйте это:

var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>(); 
foreach (TextBox item in t) 
{ 
    item.Text = ""; 
} 
+0

не работает, я получаю следующее сообщение: «Ошибка CS0120 Ссылка на объект требуется для нестатического поля, метода или свойства «Control.Controls» – Nuno

2

Я улучшил/исправил мой метод расширения.

public static class ControlsExtensions 
{ 
    public static void ClearControls(this Control frm) 
    { 
     foreach (Control control in frm.Controls) 
     { 
      if (control is TextBox) 
      { 
       control.ResetText(); 
      } 

      if (control.Controls.Count > 0) 
      { 
       control.ClearControls(); 
      } 
     } 
    } 
} 
Смежные вопросы