2010-11-03 13 views
7

मेरे पास 2 विधियां हैं जिन्हें मैंने अपने सभी टेक्स्टबॉक्सों को एएसपीनेट पृष्ठ में पुन: प्रयास करने का प्रयास किया है। पहला काम कर रहा है, लेकिन दूसरा कोई भी वापस नहीं कर रहा है। क्या कोई मुझे बता सकता है कि दूसरा क्यों काम नहीं कर रहा है?एएसपीनेट में टेक्स्टबॉक्स के माध्यम से इटरेट करना - यह क्यों काम नहीं कर रहा है?

यह ठीक काम करता है:

List<string> list = new List<string>(); 

    foreach (Control c in Page.Controls) 
    { 
     foreach (Control childc in c.Controls) 
     { 
      if (childc is TextBox) 
      { 
       list.Add(((TextBox)childc).Text); 
      } 
     } 
    } 

और "काम नहीं कर रहा" कोड:

List<string> list = new List<string>(); 

    foreach (Control control in Controls) 
    { 
     TextBox textBox = control as TextBox; 
     if (textBox != null) 
     { 
      list.Add(textBox.Text); 
     } 
    } 
+0

कोड के दूसरे कोड में, नियंत्रण में कुछ भी शामिल है? – brumScouse

उत्तर

9

आपका पहला उदाहरण प्रत्यावर्तन में से एक स्तर क्या कर रहा है, तो आप बक्सें कि अधिक से अधिक कर रहे हैं हो रही है नियंत्रण पेड़ में एक गहरा नियंत्रण। दूसरा उदाहरण केवल शीर्ष-स्तरीय टेक्स्टबॉक्स (जो आपके पास कम या कोई नहीं है) हो जाता है।

कुंजी है कि यहाँ Controls संग्रह पृष्ठ पर हर नियंत्रण नहीं है - बल्कि, यह केवल है तत्काल बच्चे को नियंत्रित करता है वर्तमान नियंत्रण के (और एक PageControl का एक प्रकार है)। उन नियंत्रणों के बदले में अपने बच्चों के नियंत्रण हो सकते हैं। इसके बारे में और जानने के लिए, ASP.NET Control Tree here और लगभग NamingContainers here के बारे में पढ़ें।

public static IEnumerable<T> FindControls<T>(this Control control, bool recurse) where T : Control 
{ 
    List<T> found = new List<T>(); 
    Action<Control> search = null; 
    search = ctrl => 
     { 
      foreach (Control child in ctrl.Controls) 
      { 
       if (typeof(T).IsAssignableFrom(child.GetType())) 
       { 
        found.Add((T)child); 
       } 
       if (recurse) 
       { 
        search(child); 
       } 
      } 
     }; 
    search(control); 
    return found; 
} 

कौन सा तो की तरह, एक extension method के रूप में प्रयोग किया जाता है:

var allTextBoxes = this.Page.FindControls<TextBox>(true); 
+0

ठीक है, लेकिन शीर्ष-स्तर टेक्स्टबॉक्स द्वारा आपका क्या मतलब है? मेरे टेक्स्टबॉक्स सिर्फ एक फॉर्म में "सामान्य" टेक्स्टबॉक्स हैं .. –

+0

@Svein मेरा अद्यतन उत्तर देखें। आपका वेब फॉर्म नियंत्रण का एक पेड़ है - नियंत्रण जिसमें नियंत्रण होता है जिसमें नियंत्रण होता है, और इसी तरह। "शीर्ष स्तर" का अर्थ है पदानुक्रम के शीर्ष, या बाहरी स्तर पर रहने वाले नियंत्रण। –

+0

विस्तृत स्पष्टीकरण और कोड उदाहरण के लिए बहुत बहुत धन्यवाद! मुझे स्टैक ओवरफ्लो पसंद है, इतने सारे महान लोग जो दूसरों की मदद करना चाहते हैं :-) –

1

आप recurse करने की जरूरत है सही मायने में पृष्ठ पर कहीं भी हर पाठ बॉक्स पाने के लिए आपको एक पुनरावर्ती विधि, इस तरह की जरूरत है। नियंत्रण एक वृक्ष संरचना में हैं - Page.Controls पृष्ठ पर सभी नियंत्रणों की एक स्पष्ट सूची नहीं है।

void GetTextBoxValues(Control c, List<string> strings) 
{ 
    TextBox t = c as TextBox; 
    if (t != null) 
     strings.Add(t.Text); 

    foreach(Control child in c.Controls) 
     GetTextBoxValues(child, strings); 
} 

List<string> strings = new List<string>(); 
GetTextBoxValues(Page, strings); 
0

तुम कोशिश कर सकते सभी बक्सें

की सूची प्राप्त करने कोड के इस टुकड़े ...: आप निम्नलिखित की तरह कुछ करने के लिए बक्सें की सभी मूल्यों को प्राप्त करने के लिए आवश्यकता होगी
public partial class _Default : System.Web.UI.Page 
    { 

     public List<TextBox> ListOfTextBoxes = new List<TextBox>(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      // after execution this line 
      FindTextBoxes(Page, ListOfTextBoxes); 
      //ListOfTextBoxes will be populated with all text boxes with in the page. 

     } 


     private void FindTextBoxes(Control Parent, List<TextBox> ListOfTextBoxes) 
     { 
      foreach (Control c in Parent.Controls) { 
       // if c is a parent control like panel 
       if (c.HasControls()) 
       { 
        // search all control inside the panel 
        FindTextBoxes(c, ListOfTextBoxes); 
       } 
       else { 
        if (c is TextBox) 
        { 
         // if c is type of textbox then put it into the list 
         ListOfTextBoxes.Add(c as TextBox); 
        } 
       } 
      } 
     } 
    } 
+0

मैंने आपको बिना किसी एट्रिब्यूशन के अपनी वेबसाइट से जोड़ने के बारे में सूचित किया है। –

संबंधित मुद्दे