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

उपरोक्त यह विधि काम नहीं करती है और नियंत्रण साफ़ नहीं होते हैं। यह ठीक संकलित करता है, लेकिन कुछ भी नहीं करता है।फ़ॉर्म में सभी टेक्स्टबॉक्स के टेक्स्ट को कैसे साफ़ करें?

कोई भी विचार?

+2

एक तरफ के रूप में, आप 'टेक्स्टबॉक्स 'के बजाय' टेक्स्टबॉक्सबॉक्स 'निर्दिष्ट करना चाहते हैं; जिसमें स्वचालित रूप से बहु-पंक्ति टेक्स्टबॉक्स, समृद्ध टेक्स्टबॉक्स आदि शामिल होंगे। – Timwi

+1

इसके अलावा, आपको 'टेक्स्टबॉक्स' पर जाने की आवश्यकता नहीं है। – SLaks

+0

यह कोड इस तरह काम करता है, लेकिन प्रत्येक कथन के लिए सुनिश्चित करें, (यह। नियंत्रण) वास्तविक नियंत्रण है जिसमें टेक्स्ट बॉक्स हैं, उदाहरण के लिए, यदि आपके पास कोई तालिका है, तो tableLayoutPanel के साथ, और टेक्स्ट बॉक्स हैं टेबल में सभी LayoutPanel, foreach (var.Controls में var c) काम नहीं करेगा, यह foreach होना चाहिए (tableLayoutPanel1.Controls में var c)। – Hammy

उत्तर

4

आपके टेक्स्टबॉक्स शायद पैनल या अन्य कंटेनर के अंदर हैं, न कि सीधे फॉर्म के अंदर।

आपको प्रत्येक बच्चे के नियंत्रण के Controls संग्रह को फिर से पार करने की आवश्यकता है।

+0

वे ग्रुपबॉक्स में हैं। कार्रवाई का सबसे अच्छा तरीका क्या होगा? –

+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 कहते हैं, इस में पृष्ठ गुजरती हैं, या (मुझे लगता है कि क्या 'इस' है)।

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(); 
      } 
     } 
    } 
} 
संबंधित मुद्दे