Event Bubbling spigi - 30. 4. 2003 14:15 - 7363 views Máte vložený DropDownList vnútri DataListu? Neviete odchytiť událosť SelectedIndexChanged? Riešením je Event Bubbling. Pokiaľ potrebujeme obslúžiť nejakú udalosť komponenty, ktorá je vložená vnútri inej komponenty, napríklad vložený DropDownList v DataList-e, tak neexistuje priama možnosť. Je síce pravda, že napríklad u komponenty typu Buttons máme možnosť odchytiť ich Click udalosť v udalosti ItemCommand v DataListe. V ASP.NET existuje možnosť nechať „prebublať“ udalosť do rodičovského kontrolu – kde ju už jednoducho obslúžime ako v prípade komponenty Button – a to v udalosti ItemCommand. Táto vlastnosť ASP.NET sa volá Event Bubbling. Pozrime sa na príklad: Najprv si vytvoríme UserControl, ktorý bude predstavovať náš DropDownList. 1.) Vytvoríme si nový UserControl a pomenujeme ho MyUserControl, do ktorého vložíme nový DropDownList. 2.) Nesmieme zabudnúť nastaviť pre tento DropDownList vlastnosť AutoPostBack na true. Nadeklarujeme si událosť MySelectedIndexChangedPublic Event MySelectedIndexChanged As _ System.Web.UI.WebControls.CommandEventHandlerV metode OnCommand nášho DropDownListu zaloláme událosť MySelectedIndexChanged a nastavíme Event Bubbling, pre náš UserControlProtected Overridable Sub OnCommand()Sub OnCommand(ByVal e As _ System.Web.UI.WebControls.CommandEventArgs) RaiseEvent MySelectedIndexChanged(DropDownList1, e) RaiseBubbleEvent(DropDownList1, e)End SubPotom v události SelectedIndexChanged zavoláme metodu OnCommandPrivate Sub DropDownList1_SelectedIndexChanged()Sub DropDownList1_SelectedIndexChanged(ByVal sender As _ Object, ByVal e As System.EventArgs) _ Handles DropDownList1.SelectedIndexChanged OnCommand(New _ System.Web.UI.WebControls.CommandEventArgs( _ "DropDownList", DropDownList1.SelectedItem.Value))End SubVýborne. V tomto momente máme pripravenú komponentu MyUserControl a môžeme odskúšať Bubbling :-) 1.) Vytvoríme si WebForm, do ktorého vložíme nový DataList. 2.) Do DataListu do ItemTemplates vložíme náš MyUserControl. 3.) Na stránku si ešte vložíme nejaký pomocný Label, pomenovaný Label1. 4.) Tento DataList nabindujeme nejakými dátami – aby sa nám vytvorilo pár záznamov.Private Sub Page_Load()Sub Page_Load(ByVal sender As _ System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then Dim ds As New DataSet ds.ReadXml(„myxml.xml“) DataList1.DataBind End IfEnd Sub5.) Ďalej už môžeme obslúžiť našu „prebublanú“ událosť. Private Sub DataList1_ItemCommand()Sub DataList1_ItemCommand(ByVal source As _ Object, ByVal e As _ System.Web.UI.WebControls.DataListCommandEventArgs) _ Handles DataList1.ItemCommand If (e.CommandName = "DropDownList") Then '// obslúženie DropDownListu End IfEnd SubDropDownList nám predstavuje objekt e.Item, vybraný index z DropDownListu je e.Item.ItemIndex. Samozrejme, že by bolo dobré, aby nám to fungovalo nabundovať nejakými dátami aj samotný DropDownList, pretože, ak bude prázdny, tak nebudú vyvolané žiadne události ;-)