2010-05-19 5 views
5

क्या उपयोगकर्ता के नियंत्रण के बाल नियंत्रण की स्थिति को गतिशील रूप से (और सामान्य रूप से) साफ़ करना संभव है? (उदाहरण के लिए, अपने बक्सें, DropDrownLists, radiobuttons, datagrids, पुनरावर्तक, आदि के सभी - मूल रूप से कुछ भी ViewState है)मैं उपयोगकर्ता नियंत्रण में सभी नियंत्रणों को गतिशील रूप से कैसे साफ़ कर सकता हूं?

मैं कुछ इस तरह कर रही से बचने के लिए कोशिश कर रहा हूँ:

foreach (Control c in myUserControl.Controls) 
{ 
    if (c is TextBox) 
    { 
     TextBox tb = (TextBox)c; 
     tb.Text = ""; 
    } 
    else if (c is DropDownList) 
    { 
     DropDownList ddl = (DropDownList)c; 
     ddl.SelectedIndex = -1; 
    } 
    else if (c is DataGrid) 
    { 
     DataGrid dg = (DataGrid)c; 
     dg.Controls.Clear(); 
    } 

    // etc. 

} 

मैं इस तरह कुछ ढूंढ रहे हैं:

foreach (Control c in myUserControl.Controls) 
    c.Clear(); 

... लेकिन जाहिर है कि यह अस्तित्व में नहीं है। क्या यह गतिशील/सामान्य रूप से पूरा करने का कोई आसान तरीका है?

+0

शायद, आपको बस एक साधारण रीडायरेक्ट चाहिए? – Alex

उत्तर

3

मैं कार्य को छोड़कर एक समाधान का सुझाव देने जा रहा था (जैसा कि छः अक्षरों के बिंदुओं के बाहर इंगित करता है) हमें इसे 1 विस्तार विधि के रूप में लागू करने की आवश्यकता है और मूल रूप से पारित नियंत्रण के सटीक प्रकार पर स्विच करें (यानी आपके तर्क को कॉपी करें आपके प्रश्न में)।

public static class ControlExtensions 
{ 
    public static void Clear(this Control c) 
    { 
     if(c == null) { 
      throw new ArgumentNullException("c"); 
     } 
     if (c is TextBox) 
     { 
      TextBox tb = (TextBox)c; 
      tb.Text = ""; 
     } 
     else if (c is DropDownList) 
     { 
      DropDownList ddl = (DropDownList)c; 
      ddl.SelectedIndex = -1; 
     } 
     else if (c is DataGrid) 
     { 
      DataGrid dg = (DataGrid)c; 
      dg.Controls.Clear(); 
     } 
     // etc.... 
    } 
} 

यह विशेष रूप से elegent नहीं लग रही विधि है, लेकिन आपके पृष्ठ/नियंत्रण में अपने कोड अब अधिक संक्षिप्त

foreach (Control c in myUserControl.Controls) { 
    c.Clear(); 
} 

और आप निश्चित रूप से अब आप कोड में कहीं और control.Clear() कॉल कर सकते हैं।

+0

मैंने यह जवाब स्वीकार कर लिया क्योंकि मुझे लगता है कि यह मेरे करीब के रूप में करीब है क्योंकि मैं अपने मूल इरादे से प्राप्त कर सकता हूं। दुर्भाग्यवश, ऐसा लगता है कि सभी बाल नियंत्रणों को साफ़ करने का कोई गतिशील तरीका नहीं है। – Michael

1

आप

foreach (Control c in myUserControl.Controls) { 
    myUserControl.Controls.Remove(c); 
} 

कर सकते हैं क्योंकि नियंत्रण सिर्फ एक सूची है, तो आप() निकालें उस पर, इसे पारित क्या आप निकालना चाहते हैं कॉल कर सकते हैं।

संपादित करें: ओह, मुझे खेद है, मैंने इसे सही ढंग से नहीं पढ़ा। मैं यह करने के लिए एक रास्ता के बारे में पता नहीं है, हो सकता है यहाँ कोई है जो प्रतिबिंब के साथ अच्छा है यह कर सकता है जहां आप इसे एक ताजा बना घटक में बदलने के लिए की तरह

foreach (Control c in myUserControl.Controls) { 
    c = new c.Type.GetConstructor().Invoke(); 
} 

या कुछ कर सकते हैं,।

+1

मुझे लगता है कि माइकल प्रत्येक नियंत्रण में मूल्य/राज्य को साफ़ करने के लिए देख रहा है। संग्रह से स्वयं नियंत्रण नहीं है। –

+0

केपी: सही। मैं * नियंत्रण * को हटाना नहीं चाहता हूं, केवल उन्हें साफ़ करें (उदा।, टेक्स्टबॉक्स टेक्स्ट मान साफ़ करें, ड्रॉपडाउनलिस्ट में चयनित आइटम को साफ़ करें, डेटाग्रिड/रिपेटर आदि की सामग्री साफ़ करें)। – Michael

+0

हाँ क्षमा करें, मेरे खराब पढ़ने को प्रतिबिंबित करने के लिए संपादित किया गया। – Nilbert

1

मैंने इसका परीक्षण नहीं किया है, लेकिन उपयोगकर्ता नियंत्रण के लिए व्यूस्टेट साफ़ करना काम कर सकता है। साथ ही आप उपयोगकर्ता नियंत्रण पर एक कस्टम विधि का पर्दाफाश हो सकता है:

usercontrol:

public void Clear() 
{ 
    this.ViewState.Clear(); 
} 

पेज:

myUserControlInstance.Clear(); 

अब फिर से मैं परीक्षण नहीं किया। यह संभव है कि यह UserControl कंटेनर के लिए केवल StateBag साफ़ करेगा, न कि इसके घोंसले/बाल नियंत्रण .. यदि उपर्युक्त काम नहीं करता है तो आप सभी बच्चों के लिए व्यूस्टेट साफ़ करने के लिए नियंत्रण पेड़ पर चलने के लिए रिकर्सन का उपयोग करने का प्रयास कर सकते हैं:

usercontrol:

public void Clear() 
{ 
    ClearViewState(this.Controls); 
} 

private void ClearViewState(ControlCollection cc) 
{ 
    foreach(Control c in cc) 
    { 
     if(c.HasControls()) 
     { 
      //clear the child controls first 
      ClearViewState(c.Controls); 
     }   

     //then clear the control itself 
     c.ViewState.Clear(); 
    } 
} 

पेज:

myUserControlInstance.Clear(); 

बस एक विचार। मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि सिद्धांत में यह काम कर सकता है। एक निहितार्थ पृष्ठ/नियंत्रण जीवन चक्र में सही बिंदु पर साफ़ करना होगा, अन्यथा यह काम नहीं कर सकता है।

आशा है कि इससे मदद मिलती है!

+0

हमम .. यह स्वयं का परीक्षण किया और काम नहीं कर रहा है .. मैं इसके साथ थोड़ा सा खेलूँगा क्योंकि मुझे अवधारणा पसंद है .. –

+0

मैंने बंदूक कूद दी। 'व्यूस्टेट 'सार्वजनिक संपत्ति नहीं है, इसलिए आप इसे नियंत्रण के लिए साफ़ नहीं कर सकते हैं। मुझे दूसरे उत्तर में चर्चा की गई रिकर्सन विचार पसंद है ... मैं इस जवाब को छोड़ दूंगा, भले ही यह काम करने वाला नहीं है, अगर दूसरों के पास एक ही विचार है ... –

0

सुझाव के रूप में क्यों नहीं:

foreach (Control c in myUserControl.Controls) 
    c.Clear(); 

और फिर साफ लागू:

public static class UserController 
{ 
    public static void Clear(this Control c) 
    { 
     c.Controls.Clear(); 
    } 

    public static void Clear(this TextBox c) 
    { 
     c.Text = String.Empty; 
    } 
} 

कि यह करना चाहिए।

+0

-1, एक्सटेंशन विधियां गतिशील प्रेषण नहीं करती हैं । – user7116

+0

तो फोरच में साफ़() को हर कॉल स्थिर नियंत्रण कॉल करेगा। क्लीयर()? तो इसे काम करने के लिए आप "if (c टेक्स्टबॉक्स) ..." के अंदर वापस आ जाएंगे। "Control.Clear() के अंदर? वास्तव में, तब एक अच्छा समाधान नहीं है। – Task

+0

सही। 'c' को 'नियंत्रण' के रूप में स्थिर रूप से टाइप किया गया है, इसलिए एक्सटेंशन विधि इसे 'नियंत्रण' के लिए देखेगी। – user7116

1
myUserControl.Controls.ToList().ForEach(c => myUserControl.Controls.Remove(c)); 

हालांकि, सावधान रहें, क्योंकि आप पुनरावृत्ति सूची को संशोधित करते हैं। इससे कुछ अजीब व्यवहार हो सकता है।

+0

माइनस 1 क्योंकि नियंत्रण हटाने के मूल प्रश्न के साथ कुछ लेना देना नहीं है। –

1

व्यक्तिगत नियंत्रण पर EnableViewState="false" सेट करना आपको यह काम सहेज सकता है, अगर यह इस उदाहरण में आपके लिए अन्य समस्याएं नहीं पैदा करता है।

1

Control.ClearChildViewState विधि के बारे में क्या?

MSDN राज्यों

सभी सर्वर नियंत्रण में होने वाले बाल नियंत्रण के लिए दृश्य-राज्य सूचना को हटाता है।

मैंने कभी इसका उपयोग नहीं किया है। तो मुझे यकीन नहीं है कि यह आपकी मदद करेगा। हालांकि अच्छा लगता है, मुझे लगता है :)

+0

ऐसा लगता है कि यह सही समाधान होना चाहिए, लेकिन दुर्भाग्यवश यह काम नहीं करता है। – Michael