Miten saadaan ajon aikana luoduille Buttoneille tehtyä tapahtumankäsittelijä? Tässä esimerkissä laitetaan pari nappia FlowLayoutPanel-tyyppiseen kehyskontrolliin. Lisäys onnistuu hienosti, mutta tapahtumat?
Public Class TestiLomake Private Sub TestiLomake_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LisääNappi("Mikki") LisääNappi("Minni") End Sub Private Sub LisääNappi(ByVal otsikko As String) Dim lisättäväNappi As New Button With lisättäväNappi .Width = 60 .Height = 28 .Text = otsikko ' ja jotain muita tarpeellisia ominaisuuksia... End With FlowLayoutPanel1.Controls.Add(lisättäväNappi) End Sub Private Sub NapinKlikkaus(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ 'Handles Minkä?.Click Dim painettuNappi As Button = CType(sender, Button) MsgBox("Klikkasit nappia " + painettuNappi.Text + ".") End Sub End Class
Edit: Korjasin NapinKlikkaus-metodin argumentteja, kopsin ne aluksi Paint-tapahtumasta... (Oli: ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Tarviiko edes noita sender- ja e-argumentteja? Koetan tässä saada tolkkua AddHandler-jutusta mutten saa kiinni ideasta. Apua kaivataan.
No voi vitsi, oliko se näin yksinkertaista... Aikani kun turasin niin löysinkin itse ratkaisun:
Private Sub LisääNappi(ByVal otsikko As String) Dim lisättäväNappi As New Button With lisättäväNappi .Width = 60 .Height = 28 .Text = otsikko End With FlowLayoutPanel1.Controls.Add(lisättäväNappi) ' Tässä samantien lisätään käsittelijä: AddHandler lisättäväNappi.Click, AddressOf NapinKlikkaus End Sub Private Sub NapinKlikkaus(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim painettuNappi As Button = CType(sender, Button) MsgBox("Klikkasit nappia " + painettuNappi.Text + ".") End Sub
Heippa vesimies!
tsekkaa tämä...myös nappulan koodi on mahdollista luoda lennossa tuomalla MSScriptControl (jos ei löydy koneelta niin löytyy netistä) COM-objektina projektiin ja käyttää hyväksi sen suomia mahdollisuuksia (jää muutama rivi vähemmän koodattavaa verrattuna delegaattien kanssa tuhraamiseen)...osviittaa käytöstä VBA-projektin ja VB-projektin näkökulmasta...
Kiitos Nea. En vaan vielä ole ymmärtänyt miten MSScriptControl:n kanssa tarvitsisi vähemmän koodia, minusta vaikuttaa ihan päinvastoin olevan.
Entä onko tarpeellista käyttää RemoveHandler kontrollia poistettaessa? Jos ei käytä niin häviääkö käsittelijä siinä kätevästi samalla vai jääkö jonnekin kummittelemaan?
Heippa taas vesimies!
Tohon ekaan: voit esim. kirjoitella sen suoritettavan koodin lennossa vaikka tekstiboxiin (scriptiä ei tarvitse välttämättä hakea tiedostosta)...
tokaan: jos et poista käsittelijää niin jäähän niitä kummittelemaan joka kerta, kun luot yhden instanssin lisää...
OK, nyt näyttää kuitenkin siltä että on kevyempi ratkaisu käyttää yksi rivi Addhandleriin ja toinen RemoveHandelriin... Mutta sikäli hyvä että mainitsit tuosta MSScriptControl:sta, saatan hyvinkin tarvita jossain muualla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.