Správičky 2 270 Blogy 577 Fórum 14 074

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ť MySelectedIndexChanged
Public Event MySelectedIndexChanged As _
    System.Web.UI.WebControls.CommandEventHandler
V metode OnCommand nášho DropDownListu zaloláme událosť MySelectedIndexChanged a nastavíme Event Bubbling, pre náš UserControl
Protected Overridable Sub OnCommand(ByVal e As _
    System.Web.UI.WebControls.CommandEventArgs)

    RaiseEvent MySelectedIndexChanged(DropDownList1, e)
    RaiseBubbleEvent(DropDownList1, e)

End Sub
Potom v události SelectedIndexChanged zavoláme metodu OnCommand
Private 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 Sub
Vý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(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
If
End Sub
5.) Ďalej už môžeme obslúžiť našu „prebublanú“ událosť.
Private 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 If
End Sub
DropDownList 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 ;-)

Ing. Igor Stanek, ASP.NET MVP, MCP

Som spoluzakladateľom a spolumajiteľom spoločnosti CHASTIA s.r.o., Poprad (www.chastia.com). V spoločnosti pôsobím ako konateľ a Software Architect.

Prevádzkujem internetový portál na online prevod jednotiek na internete www.prevody.sk a prvý internetový portál o technológii Microsoft .NET na Slovensku www.vyvojari.sk (bývalé www.AspNet.sk).

Som držiteľom certifikácie Microsoft Certified Professional a zo strany Microsoftu som už 6 rokov za sebou ocenený titulom Microsoft Most Valuable Professional za kompetenciu "ASP.NET/IIS".

Ďalšie info o mne nájdete na mojej osobnej stránke www.spigi.sk.

Článkov: 105, Správičiek: 13, Príspevkov vo fóre: 560, Príspevkov v blogu: 124, Bodov: 15560
Najaktívnejší č.: 3
Profil používateľa

Reakcie

Titulok:


Meno:


Url:
Koľko je 22 + 4? (ochrana proti spamu)

Komentár:


Najaktívnejší užívatelia
1. 35110 b. photo vlko
2. 16735 b. photo T
3. 15560 b. photo spigi
4. 6635 b. photo dudok
5. 5705 b. photo slavof
6. 5205 b. photo siro
7. 4745 b. photo duracellko
8. 3780 b. photo Liero
9. 3690 b. photo lubolacko
10. 3625 b. photo jakub