2010-11-03 19 views
5

Kullanıcının kendi web sitesi yapısını tasarlamasını sağlayacak kontrol oluşturmak istiyorum. UpdatePanel içinde TextBox (sayfa adı) ve Button 'aşağıya ekle' ile kontrollerin olduğunu hayal etmiştim. Olurdu benziyor:UpdatePanel'de dinamik oluşturulan kontroller var mı?

kullanıcı "Kullanıcılar" Adını böylece "Etiketler" elemanda butonuna kullanıcı tıklama, düzenlenebilir adıyla "Etiketler" ve "Rozetleri" arasındaki yenisini, orada görünmelidir şimdi
| "Questions" | 
| [ add below ] | 

|  "Tags" | 
| [ add below ] | 

| "Badges" | 
| [ add below ] | 

Örneğin. Tam geri gönderilmeden (sayfa yanıp sönmelerini önlemek için) yapılmalıdır.

Şimdi benim sorunum: Bu denetimleri (hepsinde değil) onInite içinde mevcut olmadıklarından yükleyemiyorum, ancak etkinlik günlüğüne katılmam gerekir. faz. Açıklanan işlevselliği nasıl sağlayabilirim?

Çok fazla zaman geçirdim ve kafam karıştı. Her ipucu için minnettar olurum. Eğer kontroller için dinamik eventhandlers istiyorsanız

cevap

12

ayrıca, kontroller reklam için olayları Görünüm durumu devam etmek için sayfa init bunları doldurmak gerekir dinamik kontroller ile ilgileniyor çünkü bu zor bir durumdur düğme tıklama esnasında bir güncelleme panelinin içine ded değil sonraki geri gönderme kadar kayıt yaptırabilecek görünüyor yapmak, böylece, normal düğmesini tıklatın olay sadece bir kez bir yeni eklenen kontrol tıkladığınızda her zaman ateşler. Bu şekilde çalışmak için yaptığımdan daha başka bir yol olabilir. Keşke bir şey öğrenmek istersem.

Çözümümün dinamik eklemiş şeyin bir listesini tutmak ve (viewstate sayfa init sırasında yüklenmemesi nedeniyle) bir oturum değişkeni depolamak etmektir. Daha sonra, sayfada önceden eklediğiniz tüm kontrolleri yükleyin. Sonra yerine bazı özel kod veya normal tıklama olayı ile sayfa yükleme sırasında click olayına.

Bunu test etmek için bir örnek sayfa oluşturduk. İşte

aspx sayfası için kodu (default.aspx) 'dir:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
    <p>This only updates on full postbacks: <%= DateTime.Now.ToLongTimeString() %></p> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:PlaceHolder ID="PlaceholderControls" runat="server"></asp:PlaceHolder> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    </form> 
</body> 
</html> 

Ve burada sayfanın arkasındaki kodu için kodu (Default.aspx.cs)' dir:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    /// <summary> 
    /// this is a list for storing the id's of dynamic controls 
    /// I have to put this in the session because the viewstate is not 
    /// loaded in the page init where we need to use it 
    /// </summary> 
    public List<string> DynamicControls 
    { 
     get 
     { 
      return (List<string>)Session["DynamicControls"]; 
     } 
     set 
     { 
      Session["DynamicControls"] = value; 
     } 
    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     PlaceholderControls.Controls.Clear(); 

     //add one button to top that will cause a full postback to test persisting values-- 
     Button btnFullPostback = new Button(); 
     btnFullPostback.Text = "Cause Full Postback"; 
     btnFullPostback.ID = "btnFullPostback"; 
     PlaceholderControls.Controls.Add(btnFullPostback); 

     PlaceholderControls.Controls.Add(new LiteralControl("<br />")); 

     PostBackTrigger FullPostbackTrigger = new PostBackTrigger(); 
     FullPostbackTrigger.ControlID = btnFullPostback.ID; 

     UpdatePanel1.Triggers.Add(FullPostbackTrigger); 
     //----------------------------------------------------------------------- 




     if (!IsPostBack) 
     { 
      //add the very first control   
      DynamicControls = new List<string>(); 

      //the DynamicControls list will persist because it is in the session 
      //the viewstate is not loaded yet 
      DynamicControls.Add(AddControls(NextControl)); 

     } 
     else 
     { 
      //we have to reload all the previously loaded controls so they 
      //will have been added to the page before the viewstate loads 
      //so their values will be persisted 
      for (int i = 0; i < DynamicControls.Count; i++) 
      { 
       AddControls(i); 
      } 
     } 


    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     if (!IsPostBack) 
     { 
      //we have to increment the initial 
      //control count here here be cause we cannot persit data in the viewstate during 
      //page init 

      NextControl++; 

     } 
     else 
     { 
      HandleAddNextClick();   

     } 

    } 

    /// <summary> 
    /// this function looks to see if the control which caused the postback was one of our 
    /// dynamically added buttons, we have to do this because the update panel seems to interefere 
    /// with the event handler registration. 
    /// </summary> 
    private void HandleAddNextClick() 
    { 
     //did any of our dynamic controls cause the postback if so then handle the event 
     if (Request.Form.AllKeys.Any(key => DynamicControls.Contains(key))) 
     { 
      DynamicControls.Add(AddControls(NextControl)); 
      NextControl++; 
     } 
    } 



    protected void btnAddNext_Command(object sender, CommandEventArgs e) 
    { 
     //this is intentionally left blank we are handling the click in the page load 
     //because the event for controls added dynamically in the click does 
     //not get registered until after a postback, so we have to handle it 
     //manually. I think this has something to do with the update panel, as it works 
     //when not using an update panel, there may be some other workaround I am not aware of 

    } 

    /// <summary> 
    /// variable for holding the number of the next control to be added 
    /// </summary> 
    public int NextControl 
    { 
     get 
     { 
      return ViewState["NextControl"] == null ? 0 : (int)ViewState["NextControl"]; 
     } 
     set 
     { 
      ViewState["NextControl"] = value; 
     } 
    } 


    /// <summary> 
    /// this function dynamically adds a text box, and a button to the placeholder 
    /// it returns the UniqueID of the button, which is later used to find out if the button 
    /// triggered a postback 
    /// </summary> 
    /// <param name="ControlNumber"></param> 
    /// <returns></returns> 
    private string AddControls(int ControlNumber) 
    { 
     //add textbox 
     TextBox txtValue = new TextBox(); 
     txtValue.ID = "txtValue" + ControlNumber; 
     PlaceholderControls.Controls.Add(txtValue); 

     //add button 
     Button btnAddNext = new Button(); 
     btnAddNext.Text = "Add Control " + ControlNumber; 
     btnAddNext.ID = "btnAddNext" + ControlNumber; 
     int NextControl = ControlNumber + 1; 
     btnAddNext.CommandArgument = NextControl.ToString(); 

     btnAddNext.Command += new CommandEventHandler(btnAddNext_Command); 
     PlaceholderControls.Controls.Add(btnAddNext); 

     //add a line break 
     PlaceholderControls.Controls.Add(new LiteralControl("<br />")); 

     return btnAddNext.UniqueID; 

    }  
} 

Bu kodun size yardımcı olup olmadığını bana bildirin. Neler olup bittiğini ve nasıl çalıştığını anlatan yorumlar eklemeye çalıştım.

+0

Kesinlikle seninkini işten sonra çözümü kontrol edecek ve daha fazla geri bildirim verin. Bunu sormasam bile örnek için çok teşekkürler! – zgorawski

+0

Bir çekicilik gibi çalışır :) Kullandığınız birkaç özellik hakkında unuttum/bilmiyordum, bu yüzden benimki çözümüm eksikti. Çok teşekkürler! Bana çok yardımcı oldum :) – zgorawski

+0

Yardım edebilirim, keşke oturumu kullanmadan bunu yapmanın bir yolu olsaydı keşke, ama ben daha fazla bilgi ve görünümleri yükler önce bilgi almak için herhangi bir kolay yolu bilmiyorum. Büyük olasılıkla gizli alanları veya kurabiyeleri kullanabiliyordunuz, ama bu fikirler bile giyilmiş gibi gözüküyor. Belki de görüntülemeyi manuel olarak yüklemek ve sayfayı init'te kullanmak için bir yol vardır. –

-1

, o zaman bu deneyebilirsiniz -

bir düğme denetimi göz önüne alındığında,

Button btnTest = new Button(); 
btnTest .Click += new EventHandler(btnTest_Click); 

Sen düğme click olayı kodunuzu olabilir,

void btnTest_Click(object sender, EventArgs e) 
{ 
    //your code 
} 
0

Bu şekilde yöntem aksi kontrolünü temizlemek aramadan önce

protected void Button_Click(object sender, EventArgs e) 
    { 
      Panel1.Controls.Clear(); 
      this.YourMethod(); 
     } 
    } 

o yükleyecektir düğme görüşmesinde bana

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Page.IsPostBack) 
     { 
      Button_Click(null, null); 
     } 
    } 

için çalışan iki kez

İlgili konular