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

위의 방법은 작동하지 않고 컨트롤이 지워지지 않습니다. 그것은 잘 컴파일하지만 아무것도하지 않습니다.양식의 모든 textBoxes의 텍스트를 지우는 방법은 무엇입니까?

아이디어가 있으십니까?

+2

제쳐두고,'TextBox' 대신'TextBoxBase'를 지정하는 것이 좋습니다. 자동으로 여러 줄 텍스트 상자, 서식있는 텍스트 상자 등이 포함됩니다. – Timwi

+1

또한 'TextBox'로 변환 할 필요가 없습니다. – SLaks

+0

이 코드는 그대로 작동하지만 각 문에 대해 (this.Controls)가 텍스트 상자가있는 실제 컨트롤인지 확인하십시오. 예를 들어 양식이 있고 tableLayoutPanel이 있고 텍스트 상자가 모두 tableLayoutPanel에서 foreach (this.Controls의 var c)가 작동하지 않으면 foreach (tableLayoutPanel1.Controls의 var c) 여야합니다. – Hammy

답변

4

텍스트 상자는 아마도 패널 또는 다른 컨테이너 안에 있으며 양식 안에 직접 들어 있지 않습니다.

모든 자식 컨트롤의 Controls 컬렉션을 재귀 적으로 통과해야합니다.

+0

그들은 GroupBox 안에 있습니다. 최선의 행동 방침은 무엇인가? –

+0

@sergio : 함수를 재귀 적으로 만들어야합니다. – SLaks

6

몇 주 전에 문제가 발생했습니다. 중단 점을 설정하고 this.Controls을 자세히 살펴보면 문제는 자연 상태를 나타냅니다. 모든 하위 컨트롤을 통해 재귀해야합니다.

코드는 다음과 같을 수 있습니다 : 처음 ClearForm를 호출 할 때,이에 합격하거나, 페이지

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); 
     } 
    } 
} 

(난 그 '이'무엇 가정).

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, 사용중인 dot net 버전은 무엇입니까? – Homam

2

그리고이, 라디오 버튼

당신이 원하는 다른 유형을 추가 할 수 있습니다 ..

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

@ 노노 당신이 양식을 제출하거나 제어 객체 –

-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(); 
      } 
     } 
    } 
} 
관련 문제