Toon posts:

[vb.net]custom events

Pagina: 1
Acties:

Verwijderd

Topicstarter
gegeven: twee usercontrols in die in een pagina zitten moeten communiceren.
oplossing: aan de hand van events geven ze een custom event arg door.

Deze klasse heb ik eerst gemaakt (FilterChangeEventArgs) met de properties die ik moet doorgeven.

Nu heb ik in mijn "caller" een raiseEvent FilterChange(Me, args) staan. args is hier van het type FilterchangeEventArgs

in de caller staat ook het volgende gedefinieerd
Visual Basic .NET:
1
Public Event FilterChange(ByVal sender As Object, ByVal e As FilterChangeEventArgs)


In de receiver staat hetvolgende
Visual Basic .NET:
1
2
3
4
5
6
7
public class UCFilter
inherits MyUserControl
....
Public Event FilterChange(ByVal sender As Object, ByVal e As FilterChangeEventArgs)

Public Sub FilterChange(ByVal sender As Object, ByVal args As FilterChangeEventArgs)
'hier is de code dit ZOU moeten uitgevoerd worden


Nu moet je die event nog "binden" in de "hoofd" pagina
Visual Basic .NET:
1
2
3
4
5
6
7
8
        ctlfilter = LoadControl(strFilter & ".ascx")

        ctlsearch = LoadControl("ucsearchresults.ascx")

        ctype(ctlfilter,UCFilter).filterchange += new FilterChangeEventArgs(ctype(ctlSearch,UCSearch).filterChange)

        filter.Controls.Add(ctlfilter)
        result.Controls.Add(ctlsearch)

Maaaar..
ctype(ctlfilter,UCFilter).filterchange >> hier kent hij "filterchange" niet ondanks dat een publiek event is. heb al gerecompiled enzo hoor..

[ Voor 5% gewijzigd door Verwijderd op 19-10-2003 16:35 ]


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
ctype(ctlfilter,UCFilter).filterchange moet met een hoofdletter..

loading...


Verwijderd

Topicstarter
vb.net is niet hoofdlettervoelig hoor..

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Ik ben niet bezig met VB.NET, maar ik zie daar iets staan dat mij nogal doet denken aan C#....
code:
1
blabla += new FilterChangeEventArgs(....

Is dit wel geldige syntax in VB.NET ?

Daarnaast lijkt het me dat FilterChangeEventArgs een class is, en geen method die je aan een event of een delegate kunt toewijzen.

Verder:
Waar gebruik je bovenstaande code? Doe je dit in de page - load?

https://fgheysels.github.io/


Verwijderd

Topicstarter
ja ik gebruik onderstaande code in page_load

Hoe moet ik die dan koppelen?
Wat ik dus wil is dat wanneer ik raiseEvent FilterChange doe, dan moet mijn code in de andere klasse "runnen" (pointer van het volgende commando moet daar dus komen te staan).
Dat ik de c# syntax heb gebruikt is waarschijnlijk omdat ik mij heb gebasseerd op een c# tutorial

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Verwijderd schreef op 19 October 2003 @ 18:33:
ja ik gebruik onderstaande code in page_load
Is het niet zo dat je pas in de Page_Prerender method de usercontrols kunt gaan aanspreken, en dat die usercontrols dus nog niet beschikbaar zijn in de page_load?
Hoe moet ik die dan koppelen?
Hoe je dat syntactisch moet doen weet ik niet, want ik doe geen VB.NET. :P

Maar het is wel zo dat je geen class aan je event kunt hangen. Je zult er een method moeten aanhangen die voldoet aan je delegate.

Stel, je hebt deze delegate gedefinieerd:
code:
1
public delegate void MyEvent ( object sender, MyEventArgs e );


Hiermee ga je dus de functie-signature gaan vastleggen van de methods die je aan delegates van het type MyEvent kunt toewijzen.
Deze methods moeten dus void return type hebben, en 2 argumenten meenemen, nl. een van het type object, en een van het type MyEventArgs.

Je neemt dan in je class een event op die methods van het type MyEventHandler moet kunnen uitvoeren:
code:
1
public event MyEvent  doSomeStuffAtSomeTime;


Stel je hebt dan deze method in een class:
code:
1
2
3
void DoSomething(object sender, MyEventArgs e)
{
}


en die wil je aan je event-handler gaan hangen:
code:
1
MyClass.doSomeStuffAtSomeTime += new MyEvent(DoSomething);


Op een gegeven moment kan je dan de method DoSomething gaan uitvoeren door de methods te gaan uitvoeren die in de eventhandler hangen:
code:
1
2
3
4
if( doSomeStuffAtSomeTime != null )
{
   doSomeStuffAtSomeTime(this, new MyEventArgs("something");
}


Nu is het weer C#. :P Omzetten naar VB code kan je zelf wel doen denk ik.
Dit is gewoon ff om aan te tonen hoe het in z'n werk gaat.


Hier heb ik ook eens iets gepost ivm delegates etc. Misschien is dat nog iets meer uitgewerkt. Het is echter ook C# (en icm WinForms).

[ Voor 12% gewijzigd door whoami op 19-10-2003 18:42 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
weet iemand de syntax voor vb.net?

edit:
found it: ipv (UCsearch)mijnControl.mijnevent += ...
is het :
Addhandler ctype(mijncontrol,ucsearch).mijnevent,addressof ctype(mijncontrol,ucresults)

Nu heb ik nog een vraagje. Wat is juist het verschil tussen deligates en events. Ik dacht ergens gelezen te hebben dat delegates afkomstig waren van vb 6 en eigenlijk niet meer mogen gebruikt worden?
Is het correct als ik zeg dat wanneer een raise event wordt uitgevoerd de pointer naar het adres van het volgende element wordt verandert naar waar de funtie wordt uitgevoerd (+ return adres op stack zetten)?

Event is het zelfde eigenlijk als een functie call buiten je class?

[ Voor 91% gewijzigd door Verwijderd op 20-10-2003 08:40 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Beste s-man2,

Ik heb hier voor jou de gehele gedachtengang met voorbeeldcode uit de doeken gedaan. Doe nu eens zelf de moeite om in de MSDN of de .NET help de VB.NET syntax op te zoeken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 20 October 2003 @ 08:38:
Beste s-man2,

Ik heb hier voor jou de gehele gedachtengang met voorbeeldcode uit de doeken gedaan. Doe nu eens zelf de moeite om in de MSDN of de .NET help de VB.NET syntax op te zoeken.
Zie vorige reply, hebbem aangepast! (hebbet trouwens gevonden)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Events gebruiken delegates.
De stelling dat delegates van VB stammen , en je ze beter niet meer gebruikt is niet waar.
An event is a message sent by an object to signal the occurrence of an action. The action could be caused by user interaction, such as a mouse click, or it could be triggered by some other program logic. The object that raises (triggers) the event is called the event sender. The object that captures the event and responds to it is called the event receiver.

In event communication, the event sender class does not know which object or method will receive (handle) the events it raises. What is needed is an intermediary (or pointer-like mechanism) between the source and the receiver. The .NET Framework defines a special type (Delegate) that provides the functionality of a function pointer.

A delegate is a class that can hold a reference to a method. Unlike other classes, a delegate class has a signature, and it can hold references only to methods that match its signature. A delegate is thus equivalent to a type-safe function pointer or a callback. While delegates have other uses, the discussion here focuses on the event handling functionality of delegates.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

En Events zijn daarbij goed bruikbaar als je geen callback nodig hebt... :)
Daarnaast maakt ASP.Net al sowieso heel veel gebruik van Events; neem bijvoorbeeld Load, Init, Prerender, etc. Ik ben dus ook benieuwd waar jouw stelling vandaan komt.

[ Voor 53% gewijzigd door gorgi_19 op 20-10-2003 09:44 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1