Event se nespouští   zodpovězená otázka

VB.NET

Zdravím, potřeboval bych poradit s Eventy. Dejme tomu ža mám nějákou svoji třídů, kde chci spouštět event pokaždé, když se ji změní vlastnost.

Takže mám:

Public Class ClassUzivatel

Private _userName As String

Public Property UserName As String
        Get
            Return _userName
        End Get
        Set(ByVal value As String)

            If _userName <> value Then
                _userName = value
                RaiseEvent UserIsChanged() 
            End If
        End Set
End Property


Private Sub NactiData()
'Nějáký kód který načte data a přiřadí je do vlastnosti

   Me.UserName="Nějáká načtená hodnota"
End Sub

Sub New
   NactiData() 'načtu data při vytvoření objektu
End Sub



Public Event UserIsChanged()

End Class

A pak si třeba ve formuláři nadeklaruju:

Dim WithEvents NovyUzivatel As ClassUzivatel=New ClassUzivatel

Private Sub NovyUzivatel_UserIsChanged() Handles NovyUzivatel.UserIsChanged
'zde je nějáký kód
Exit Sub

Problém je v tom, že se mi událost NovyUzivatel_UserIsChanged vůbec nespustí. Když si kód krokuju, tak mi to v Property třídy na řádek na kterém volám RaiseEvent sice najede, ale napojená procedura se nespustí. Mohl by mi někdo poradit co dělám špatně? S vlastníma událostma zatím nemám moc zkušenosti.

A pak je tu ještě jedna věc, vím že bych měl do událostí dávat parametry Sender typu Object a pak parametr typu System.EventArgs, mohl by mě někdo nakopnout co konkrétně se do těchto parametrů dává?

Předem díky

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

Kód funguje bez problémů. Chyba bude v tom, že máte nejspíš deklarováno NovyUzivatel na nesprávném místě (aby to fungovalo správně, musí se deklarovat jako Private na úrovni třídy a životnost končí v momentě zaniknutí této třídy).

Při deklarování událostí je doporučeno používat události založené na generickém delegátu EventHandler(Of TEventArgs). Parametr sender je zdroj, ze kterého událost pochází, ve většině případů tam můžete dosadit Me. Parametr e jsou parametry události, což je libovolná třída odvozená od třídy EventArgs.

Následující příklad ukazuje praktické použití.

Module Module1
  'Deklarativní definice třídy s událostí
  Private WithEvents _mainWorker As New Worker
  Sub Main()
    'Spustit činnost
    _mainWorker.DoWork()
    Console.ReadKey()
  End Sub
  'Obslužná metoda události WorkCompleted
  Private Sub _mainWorker_WorkCompleted(ByVal sender As Object, ByVal e As WorkCompletedEventArgs) Handles _mainWorker.WorkCompleted
    'Provést pouze pokud zdroj události je typu Worker
    Dim worker = TryCast(sender, Worker)
    If worker IsNot Nothing Then
      Console.WriteLine(String.Format("Výsledek z {0} je {1}.", worker.Id, e.Result))
    End If
  End Sub
End Module

Public Class Worker
  'Identifikátor třídy
  Private _id As String
  'Definice události pomocí generického delegátu
  Public Event WorkCompleted As EventHandler(Of WorkCompletedEventArgs)
  Public Sub New()
    'Vytvoření unikátního identifikátoru třídy
    _id = Guid.NewGuid().ToString().ToUpper()
  End Sub
  Public Sub DoWork()
    'Simulace činnosti
    Threading.Thread.Sleep(1000)
    Dim randomizer As New Random
    Dim e As New WorkCompletedEventArgs(randomizer.Next())
    'Vyvolání události
    RaiseEvent WorkCompleted(Me, e)
  End Sub
  Public ReadOnly Property Id() As String
    Get
      Return _id
    End Get
  End Property
End Class

'Parametry události dokončení činnosti (WorkCompleted)
Public Class WorkCompletedEventArgs
  Inherits EventArgs
  Private _result As Integer
  Public Sub New(ByVal result As Integer)
    _result = result
  End Sub
  'Výsledek činnosti
  Public ReadOnly Property Result() As Integer
    Get
      Return _result
    End Get
  End Property
End Class 

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za vysvětlení těch parametrů.

Problém s Eventem byl opravdu způsoben špatnou deklarací (ale zjistil jsem že to funguje i když je třída nadeklarovaná jako public).

Jenom jsem zjistil ještě jednu věc a to že když při vzniku třídy v konstruktoru nastavím nějáké property, tak se jejich událost nespustí. Pokud je změním později tak je to ok. To je standartní chování?

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

Pokud máte v době vytváření instance třídy již deklarativně přiřazenou obslužnou metodu, potom to bude fungovat.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Ok díky

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