2010-11-20 23 views
-1

Her şeyden önce, sorumun yinelenen bir kopyası varsa özür dilerim, ama çok fazla aradım ve çözümü bulamıyorum. Senaryoda bir UserControl var. Bu kullanıcı denetimi, verilen List '>> 0 ise dinamik olarak ListBox'lar yaratacaktır. Kontroller dinamik olarak eklenir, bunları eklemenin bir problemi yoktur, ancak olay işleyicisi eklenmez. İlk listBox'ta bir öğe seçtiğimde, secondListBox dinamik olarak eklenir ve öğeler de dinamik olarak eklenir. İlk liste kutusu görünür, ancak selectedIndexChanged olay işleyicisi çalışmaz. Kodumda sorun ne olabilir?Dinamik olarak eklenmiştir ListBox'ın EventHandler'ı ASP.Net üzerinde ateş açmıyor

DÜZENLEME: Ben

li.Attributes.Add("onselectedindexchanged","selectedIndexChanged"); 

veya

li.AutoPostBack = true; 

ama yine tetiklenmediğini

...

private List<string> myList = new List<string>() { "Serkan", "Kadir" }; 
    private List<string> mySecondList = new List<string>() { "Istanbul", "Ankara" }; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      if (myList.Count > 0) 
      { 
       ListBox li = new ListBox(); 
       li.ID = Guid.NewGuid().ToString(); 
       li.SelectedIndexChanged += new EventHandler(this.selectedIndexChanged); 
       foreach (string item in myList) 
       { 
        li.Items.Add(item); 
       } 

       this.Controls.Add(li); 
      } 
     } 
    } 

    private void selectedIndexChanged(object sender, EventArgs e) 
    { 
     ListBox li2 = new ListBox(); 
     li2.ID = Guid.NewGuid().ToString(); 

     foreach (string item in mySecondList) 
     { 
      li2.Items.Add(item); 
     } 
     this.Controls.Add(li2); 
    } 

cevap

0

Folks, kodum iyi çalışıyor. Bunu bugün farklı bir görsel stüdyoda denedim ve her şey iyi çalıştı. @ RichardW1001 ve @Microgen ilginiz ve yayınlarınız için teşekkür ederiz.

0
li.Attributes.Add("onselectedindexchanged","selectedIndexChanged"); 

bir istemci tarafı HTML ekler eklemek çalıştı bağlıyor. Burada gösterdiğiniz selectedIndexChanged yöntemi bir sunucu tarafı yöntemidir. Ya kontrolünüze otomatik olarak post-back eklemeniz ve sunucudaki C# işlevini çağırmak için sunucu tarafındaki olay işleyicisini veya istemci tarafını işlemek için istemci tarafındaki bir JavaScript işlevini yapmanız gerekir. Etkinlik.

düzenleme ---

sayfa sunucuya geri gönderilen edildiğinde, kontrol yok olur. Sayfa, liste kutusunun denetim koleksiyonuna eklenmiş olmayan yeni bir durumdur. Otomatik geri gönderme doğru olduğunda olay çağrılır, ancak denetim, sunucunun Sayfa nesnesinde yok ve eğer Page.IsPostBack komutunu kaldırırsanız, denetim yeniden oluşturulur ve böylece denetim Olayı yükseltilmiş olan ve bu kontrol hala mevcut değil.

Bu denetimin asıl amacı nedir? Bir master-detay şeyi sağlamak mı?

düzenlemek 2 ---

işleri sizin için

düzenlendi çözüm:

Sayfa:

<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true" Visible="false" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"></asp:ListBox> 
<br /> 
<asp:ListBox ID="ListBox2" runat="server" Visible="false"></asp:ListBox> 

Codebehind: etkinliklerinizi

private List<string> myList = new List<string> { 
    "Serkan", 
    "Kadir" 
}; 
private List<string> mySecondList = new List<string> { 
    "Istanbul", 
    "Ankara" 

}; 
protected void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!Page.IsPostBack) { 
     if (myList.Count > 0) { 
      ListBox1.DataSource = myList; 
      ListBox1.DataBind(); 
      ListBox1.Visible = true; 
     } 
    } 
} 

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ListBox2.DataSource = mySecondList; 
    ListBox2.DataBind(); 

    ListBox2.Visible = true; 
} 
+0

tüm şeyleri kaçırıyorsunuz. Bu kontroller manuel olarak eklenir. Lütfen sorumu dikkatle okuyun, kontroller dinamik olarak eklenecektir (bu, N sayı liste kutusu olacak demektir) ve olay işleyicileri de. Manuel olarak ekliyor ve görünürlüğü değiştiriyorsunuz. Üzgünüm, ama bu benim sorumun cevabı değil. –

+0

Üzgünüm, yapmaya çalıştığım nokta, Controls koleksiyonunun Sayfa'nın belirli bir örneğine ait olmasıdır. Sunucudan bir sayfa talep ettiğinizde, yeni bir örnek oluşturulur, yani, artık mevcut olmayan sayfanın önceden oluşturulmuş bir örneğine eklediğiniz denetimler hakkında hiçbir şey bilmiyor. – RichardW1001

+0

ASP.net HTML üretir, HTML'de "görünürlük" yoktur. Bu yaklaşımı önerdiğim nedeni, yönteminizle aynı HTML biçimlendirmesini oluşturacak olması, ancak post-back üzerinde çalışacak olmasıdır. Ne görünür = false ASP.net'e herhangi bir HTML oluşturmamasını söyler. Önemli fark, kontrolün, Page/UserControl'ün her bir örneğinde kayıtlı olması ve bu nedenle, eklediğiniz kontrollerin geri gönderim üzerinde çalışmayacağı olaylar vb. Ile kullanım için geçerli olmasıdır, çünkü bunlar yalnızca önceki bir örnekte var olurlar. artık yok. BTW orijinal sorunuz değişken sayıda seviyesinden bahsetmiyor. – RichardW1001

0

nedeni oluyor değil çünkü ASP.Net sayfa yaşam döngüsünü yanlış anlıyorsunuzdur. Bir sayfa istediğinde, ASP.Net karşılık gelen sayfa sınıfının yeni bir örneğini oluşturur. Bu örnek, geçmişte yaratılmış olan başka hiçbir şey hakkında hiçbir şey bilmiyor. Tarayıcıya yanıt olarak geri gönderdiği bir grup HTML oluşturmak için Sayfa sınıfının örneğini kullanır. Sunucudaki sayfa sınıfının o durumu, durumuyla birlikte yok edilir.

Bir sayfa geri gönderildiğinde, ASP.Net, görünüm, ids vb. Kullanarak okur ve yeni oluşturulan Sayfa örneğinizdeki sunucu denetimlerine geri gönderilen HTML öğelerini eşler. Önceki örneğe ait Denetimler koleksiyonuna eklediğiniz öğeler bu yeni örnekte mevcut değildir ve bu nedenle ASP.Net bunları tanıyamaz veya bunlardaki olayları tetikleyemez.

GridViews ile olsa da, elde etmeye çalıştığınızı düşündüğüm şeyin türünü gösteren bir makalede, daha önce gönderdiğim çözümle benzer bir yaklaşım kullanıyor. daha iyi bir çözüm olabilir çünkü

http://www.codeproject.com/KB/aspnet/MultiNestMDGridview.aspx

Belki, nihai hedef tam olarak ne açıklayabilir? Hem daha önce gönderdiğim yaklaşımın hem de bu bağlantıdaki çözümün sınırlamasının, gerçekte yapmaya çalıştığınız şeye bağlı olarak sorun yaratabilecek ya da olmayabilecek, sınırlı sayıda detay seviyesinin mevcut olduğunu kabul ediyorum. .

Edit--

Eğer @Microgen anlaşılacağı gibi page_ınit olayına değiştirirseniz, gerçek (! Page.IsPostBack), ayarlarsanız AutoPostBack = kaldırın ve dinamik olarak eklenen kontrolü için bir uçucu olmayan kimlik kullanan Bu, sunucu tarafı olayını çağırır ve 2. liste kutusunu oluşturur. Guid.New() ile çalışmayacaktır çünkü yeni oluşturulan Sayfadaki Denetimler koleksiyonu, eşleşen tanıtıcıyla hiçbir şey içermeyecek, böylece olay işleyicisi bağlanmayacaktır. Bu, aslen yayınlandığı gibi soruyu yanıtlayacaktır. Bununla birlikte, 2. liste kutunuz, siz oluşturmazsanız ve 3. Sayfada, yukarıda açıklanan nedenlerden dolayı Page. Check in Page_ Check'lerini aynı şekilde vb.

0

1 dinamik olarak ekleme denetimleri, page_init olayına page_init olayı yüklenmemelidir. 2-işaretli liste kutuları .attributes.add ("selectedindexchanged", "...") ile çalışmaz. asp.net denetimi ancak bu html içinde düzenli girdi olarak

+0

10 Onay kutusu listesini kullanmıyorum .. ListBox'ı kullanıyorum –

+0

Hangi ASP.net denetimi, ListBox, CheckBoxList, her ne olursa olsun, @Microjen ve kendimi yapmak noktası olup olmadığını farketmez, ASP.net denetimleri müşteri üzerinde var. ASP.net, HTML oluşturmak için bir soyutlama olarak denetimleri kullanır, tarayıcıdaki gibi denetimler yoktur. – RichardW1001