2011-01-28 20 views
5

मैं एक समग्र एएसपी.NET नियंत्रण बनाने की कोशिश कर रहा हूं जो कि आप एक संपादन योग्य नियंत्रण संग्रह बनाते हैं।एएसपी.नेट गतिशील नियंत्रण गिनती (जैसे ही आप जाते हैं नियंत्रण बनाते हैं)

मेरी समस्या यह है कि जब मैं ऐड या पोस्टबैक बटन दबाता हूं (जो फ़ॉर्म को पोस्टबैक करने के अलावा कुछ भी नहीं करता है) टेक्स्ट बॉक्स में दर्ज किए गए किसी भी मान खो जाते हैं।

जब मैं पोस्टबैक के बीच नियंत्रण की संख्या बदलता हूं तो मैं इसे काम नहीं कर सकता। मुझे मूल रूप से नियंत्रण राज्य संपत्ति ControlCount के आधार पर नियंत्रण जीवन चक्र में दो अलग-अलग समय पर नियंत्रण पेड़ को फिर से बनाने में सक्षम होना चाहिए।

public class AddManyControl : CompositeControl 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     EnsureChildControls(); 
    } 

    protected override void CreateChildControls() 
    { 
     var count = ViewState["ControlCount"] as int? ?? 0; 

     for (int i = 0; i < count; i++) 
     { 
      var div = new HtmlGenericControl("div"); 
      var textBox = new TextBox(); 
      textBox.ID = "tb" + i; 
      div.Controls.Add(textBox); 
      Controls.Add(div); 
     } 

     ViewState["ControlCount"] = count; 

     var btnAdd = new Button(); 
     btnAdd.ID = "Add"; 
     btnAdd.Text = "Add text box"; 
     btnAdd.Click += new EventHandler(btnAdd_Click); 
     Controls.Add(btnAdd); 

     var btnPostBack = new Button(); 
     btnPostBack.ID = "PostBack"; 
     btnPostBack.Text = "Do PostBack"; 
     Controls.Add(btnPostBack); 
    } 

    void btnAdd_Click(object sender, EventArgs e) 
    { 
     ViewState["ControlCount"] = (int)ViewState["ControlCount"] + 1; 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 
     // If I remove this RecreateChildControls call 
     // the collection lags behind each postback 
     // because the count is incremented in the btnAdd_Click event handler 
     // however, the values are not lost between postbacks 
     RecreateChildControls(); 
    } 
} 

उत्तर

5

यदि आप एएसपी.नेट के कस्टम नियंत्रणों के साथ खेलना चाहते हैं, तो आपको इसके नियम और इसकी पसंद से खेलना होगा! जब आप कस्टम नियंत्रण में OnPreRender के साथ खेलना शुरू करते हैं, तो आप जानते हैं कि आप उस समय के गलत ट्रैक पर 90% हैं।

आम तौर पर, व्यूस्टेट का उपयोग करने का सबसे अच्छा तरीका मानक एएसपी.NET नियंत्रणों की तरह बैक अप की गई संपत्ति घोषित करना है (.NET Reflector वर्षों के लिए मेरा शिक्षक रहा है!)। इस तरह, यह घटना के जीवन चक्र के दौरान स्वाभाविक रूप से पढ़ा और बचाया जाएगा।

यहाँ, एक कोड है कि आप क्या चाहते हैं, काफी स्वाभाविक रूप से करने के लिए लगता है किसी भी चाल के बिना:

public class AddManyControl : CompositeControl 
{ 
    private void AddControl(int index) 
    { 
     var div = new HtmlGenericControl("div"); 
     var textBox = new TextBox(); 
     textBox.ID = "tb" + index; 
     div.Controls.Add(textBox); 
     Controls.AddAt(index, div); 
    } 

    protected override void CreateChildControls() 
    { 
     for (int i = 0; i < ControlsCount; i++) 
     { 
      AddControl(i); 
     } 

     var btnAdd = new Button(); 
     btnAdd.ID = "Add"; 
     btnAdd.Text = "Add text box"; 
     btnAdd.Click += new EventHandler(btnAdd_Click); 
     Controls.Add(btnAdd); 

     var btnPostBack = new Button(); 
     btnPostBack.ID = "PostBack"; 
     btnPostBack.Text = "Do PostBack"; 
     Controls.Add(btnPostBack); 
    } 

    private int ControlsCount 
    { 
     get 
     { 
      object o = ViewState["ControlCount"]; 
      if (o != null) 
       return (int)o; 

      return 0; 
     } 
     set 
     { 
      ViewState["ControlCount"] = value; 
     } 
    } 

    void btnAdd_Click(object sender, EventArgs e) 
    { 
     int count = ControlsCount; 
     AddControl(count); 
     ControlsCount = count + 1; 
    } 
} 
+0

+1, यह ठीक काम करता है, मैं इस –

+0

के बारे में उत्सुक था क्योंकि सभी 'टेक्स्टबॉक्स' प्रत्येक बार पोस्टबैक अर्जित होने पर खरोंच से फिर से जोड़े गए थे, वे अपने टेक्स्ट मानों को कैसे पुनर्स्थापित करते हैं? एएसपीनेट ने खुराक की खुराक की? –

+0

@Rami - हाँ, यह व्यूस्टेट जादू है, जब यह ठीक काम करता है :-) –

-2

मेरा मानना ​​है कि आप को देखने के राज्य में नियंत्रण जोड़ने के लिए:

यह परीक्षण समस्या को ठीक करने के लिए इस्तेमाल किया जा सकता है।

+0

नहीं, यह उस तरह काम नहीं करता है। यह कुछ और है। कुछ जीवन चक्र घटनाएं दूसरी बार नहीं चल रही हैं (क्योंकि नियंत्रण पेड़ को फिर से बनाया जा रहा है)। समाधान के लिए –

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