Volání metody dle názvu metody   zodpovězená otázka

VB.NET, .NET

Předem děkuji. Na začátek musím napsat, že už tady diskuze na podobné téma proběhla viz. http://www.vbnet.cz/forum-tema--234-disk.... Avšak potřebuji helpnout z následující procedurou: Potřebuji provést metodu na Button2_Click. Ale pozor z objetku button2 mám již odebránu událost Button2_Click (příkazem removehandler) a samotné volání je možné pouze pomocí názvu procedury (tzn. typ string "Button2_Click") tzn. že nelze použít volání:

Button2_Click(sender,e)

Button2.PerformClick

Jak psal Tomaš Hercig, je možné zavolat proceduru nebo funkci dle názvu pomocí reflection, ale pro případ, že volám samotnou proceduru Button2_Click to nefunguje (viz. níže kód Tomáše Heciga)

Public Class Form1
    Public Sub MojeProcedura(ByVal p1 As String, ByVal p2 As String)
        'zobrazit parametry
        MsgBox("ahoj " & p1 & " " & p2)
    End Sub

    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
        'zavolat proceduru jménem
        Me.GetType().GetMethod("MojeProcedura").Invoke(Me, New Object() {"parametr 1", "parametr 2"})
    End Sub
End Class


Jinak jsem připravil malou ukázku pro testování zde (pozor button je s názvem button2)

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

RemoveHandler Button2.Click, AddressOf Button2_Click

AddHandler Button2.Click, AddressOf NahradaDefaultu

End Sub

Private Sub NahradaDefaultu(ByVal sender As Object, ByVal e As System.EventArgs)

' Me.GetType().GetMethod("MojeProcedura").Invoke(Me, New Object() {"parametr 1", "parametr 2"})

' Me.GetType().GetMethod("Button2_Click").Invoke(Me, New Object() {sender, e}) 'nefunguje ???

'Zde je nutné pomocí názvu "Button2_Click" zavolat proceduru Button2_Click

End Sub

Public Sub MojeProcedura(ByVal p1 As String, ByVal p2 As String)

'zobrazit parametry

MsgBox("ahoj " & p1 & " " & p2)

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

MsgBox("Ok")

End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechte se inspirovat v diskuzi o dynamickém EventHandleru ( http://www.vbnet.cz/forum-tema--1997-dyn... ), nyní si vypůjčím kód od pana Linharta:

Public Class Form1
  Private _clickEventHandler As [Delegate]
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'Za Form1_Click lze dosadit název libovolné metody
    's odpovídající signaturou.
    _clickEventHandler = [Delegate].CreateDelegate(GetType(EventHandler), Me, "Form1_Click")
    AddHandler Me.Click, _clickEventHandler
  End Sub
  Private Sub Form1_Click(ByVal sender As Object, ByVal e As EventArgs)
    MessageBox.Show("Klepnutí na Form1.")
  End Sub
End Class

Akorát nemapujte proceduru na událost a rovnou volejte:

_clickEventHandler.Invoke(...)
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Super nápad, děkuji

Jen musím použít DynamicInvoke, ale jinak je vše funkční.

Chválím a zdravím.

 _clickEventHandler.DynamicInvoke(sender, e)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback