2011-01-28 24 views
5

Düzenlenebilir bir denetim koleksiyonu oluşturmanıza izin veren bir bileşik ASP.NET denetimi oluşturmaya çalışıyorum.ASP.NET dinamik denetimleri sayısı (giderken denetimleri oluşturma)

Sorunum, ekleme veya geri gönderme düğmesine bastığımda (formu geri göndermekten başka bir şey yapmadığında) metin kutularına girilen değerlerin kaybolmasıdır.

Denetimlerin sayısı geri gönderimler arasında değiştiğinde çalışmaya yaralamıyorum. Temel olarak, kontrol ağacının görünüm durumu özelliğine göre ControlCount'a bağlı olarak iki farklı zamanlarda yeniden oluşturulmasına ihtiyacım var.

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

cevap

5

ASP.NET'in özel denetimleriyle oynamak istiyorsanız, kendi kurallarına ve seçiciliğine göre oynamak zorundasınız! Özel bir kontrolde OnPreRender ile oynamaya başladığınızda, zamanın% 90'ında yanlış yolda olduğunuzu biliyorsunuz.

Genel olarak, ViewState'i kullanmanın en iyi yolu, standart ASP.NET denetimlerinin yaptığı gibi (.NET Reflektörü yıllardır öğretmenim oldu!) Tarafından desteklenen bir özelliği bildirmektir. Bu şekilde, olayın yaşam döngüsü boyunca doğal olarak okunacak ve kaydedilecektir. İşte

herhangi bir hile olmadan, oldukça doğal, istediğini yapmak gibi görünen bir koddur:

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, iyi çalışıyor, ben tüm 'textboxes' sıfırdan yeniden her seferinde yeniden kazandım, bu yüzden onlar metin değerlerini nasıl geri geldiği için bu –

+0

merak ettim? asp.net dozu do? –

+0

@Rami - evet, iyi çalışıyorsa, Viewstate sihri budur :-) –

-2

Sana görünüm durumuna kontrolünü eklemek zorunda inanıyoruz:

Bu test

sorunu yeniden oluşturmak için kullanılabilir.

+0

Hayır, öyle çalışmıyor ediyor. Bu başka bir şey. Belirli yaşam döngüsü olayları ikinci kez çalıştırılmıyor (kontrol ağacı yeniden oluşturulduğundan). Çözüm için –

İlgili konular