[.NET/C#] WinForm events triggeren

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Ik zit met een ei. :P

Ik wil in m'n WinForm applicatie events triggeren (zoals bv. de click event van een button), zonder dat ik daarvoor de naam van de functie die aan die event gekoppeld is hoef te kennen.
Met andere woorden: ik wil de method aanroepen, zonder de methodnaam te gebruiken.

In Delphi kan je het bv zo doen:
code:
1
2
3
if Assigned (Button1.OnClick) then begin
  Button1.OnClick(self);
end;


In C# kan je het ook doen met zelf gebakken delegates, als je bv deze custom delegate hebt:
code:
1
2
3
public delegate void ObserverDelegate(object sender);

public Observer DoAfterOk;


Kan je de method(s) waar DoAfterOk naar 'wijst', als volgt aanroepen:
code:
1
2
3
4
if( DoAfterOk != null )
{
    DoAfterOk(this);
}


Het lukt me echter niet om dus de standaard events op die manier uit te voeren. Bv:
code:
1
2
3
4
5
6
if( Button1.Click != null )
{

    Button1.Click(this, null);

}


Hier krijg ik een compiler error op:
The event 'System.Windows.Forms.Control.Click' can only appear on the left hand side of += or -=
Blijkbaar kan je dus enkel methods aan die events gaan toekennen of verwijderen, maar hoe kan je zelf die events triggeren?
Er moet toch wel een manier zijn om dit te verwezenlijken? In de .NET help heb ik er echter niet direct iets over gevonden.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Oeh.. Dat ei wil ik iig wel hebben... :P * gorgi_19 heeft iig nog spek liggen.. :Y)

En volgens mij zoek je RaiseEvent (alleen is dit VB.Net) Ik weet alleen niet of je RaiseEvent kan gebruiken om events uit de controlcollection te firen.

Wat ik me afvraag; waarom werkt een constructie als

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Class WhoamiTest
    Inherits UserControl

    Private Sub InitPage(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Init

        Dim _button As Button = New Button
        AddHandler _button.Click, AddressOf Me.ClickButton

    End Sub


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

        ' Voer hier clickActies uit

    End Sub

    Private Sub ClickNoEvent()

        Me.ClickButton(Me, Nothing)

    End Sub

End Class

Niet?

Je voert zo iig geen clickevent uit, maar je roept de handler van het clickevent.

En ik weet niet of winforms hierbij wezenlijk verschilt van webforms.. :P

[ Voor 93% gewijzigd door gorgi_19 op 07-12-2003 11:33 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Hier staat een voorbeeltje met een RaiseEvent in vb.net en hetzelfde voorbeeldje in c#.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 13:25

Crazy D

I think we should take a look.

Misschien snap ik je niet :P Maar bedoel je niet Button1.PerformClick() ?

Exact expert nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Crazy D schreef op 07 december 2003 @ 11:54:
Misschien snap ik je niet :P Maar bedoel je niet Button1.PerformClick() ?
Je hebt idd een PerformClick method waarmee je het probleem van dit voorbeeld kunt oplossen. Echter, er is geen Performxxxx method voor iedere event.

gorgi_19:
Zo kan je het idd ook doen, (en zo heb ik het al gedaan), maar dat vind ik op de een of andere manier te omslachtig. :P
Verwijderd schreef op 07 december 2003 @ 11:44:
Hier staat een voorbeeltje met een RaiseEvent in vb.net en hetzelfde voorbeeldje in c#.
Tja, dit is ook met custom events, en dat is idd geen probleem. Het lukt me wel om het zo te doen met custom events, maar niet met de standaard events van de controls.

[ Voor 53% gewijzigd door whoami op 07-12-2003 12:53 ]

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Uw antwoord:
http://groups.google.com/...%26btnG%3DGoogle%2BSearch
Je hebt idd een PerformClick method waarmee je het probleem van dit voorbeeld kunt oplossen. Echter, er is geen Performxxxx method voor iedere event.
Welkom in de wondere wereld van de grootste groep dombo's op aarde: de Winforms designers/programmeurs. ("Lets base our synchronised .NET controls on win32 async, message based controls!" "Yes! wonderful idea! Saves us a lot of typing! Get rich quick!")

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Doel je op de GetInvocationList method?

Als ik dit doe:
code:
1
Delegate[] blaat = ((MulticastDelegate)(btnToevoegen.Click)).GetInvocationList();


dan krijg ik daar ook diezelfde compiler error (event can only appear on left side of += or -=).

Met die Target en Method properties kom ik ook niet veel verder.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik heb verder niet naar die docs gekeken die er gelinkt staan, staat daar wat zinnigs in?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Het zijn gewoon pagina's uit de MSDN zoals we die wel kennen. Wat uitleg over een method. Behalve die Target en Method prperty van MultiCastDelegate staat er eigenlijk niets in dat ik nog niet wist.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Hmmm. Ik heb dezelfde vraag een tijdje geleden op de DOTNET-CLR list gesteld, kon hem alleen zo 1 2 3 niet terugvinden. Zal nog eens een poging wagen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Hmm. kan hem zo 1 2 3 niet terugvinden, maar nu ik wat gegoogled heb hierover, herinner ik me dat in mijn geval het om een local event ging, dus dat de lijst met delegates werd opgevraagd vanuit dezelfde class als waar de eventhandler is gedefinieerd. In jouw geval is dat dus niet het geval, jij zit buiten de class.

verder herinnerde ik me dat een event alleen kan worden afgevuurd door de class waar het event op is gedefinieerd. Jij zit daar buiten, dus ik denk dat je pech hebt...

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

EfBe schreef op 07 december 2003 @ 20:48:
Hmm. kan hem zo 1 2 3 niet terugvinden, maar nu ik wat gegoogled heb hierover, herinner ik me dat in mijn geval het om een local event ging, dus dat de lijst met delegates werd opgevraagd vanuit dezelfde class als waar de eventhandler is gedefinieerd. In jouw geval is dat dus niet het geval, jij zit buiten de class.

verder herinnerde ik me dat een event alleen kan worden afgevuurd door de class waar het event op is gedefinieerd. Jij zit daar buiten, dus ik denk dat je pech hebt...
Hatseflats, you have got new email

[ Voor 10% gewijzigd door Jaymz op 07-12-2003 21:05 ]

Pagina: 1