[VB.NET] Parent Aanspreken

Pagina: 1
Acties:

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 04-04 21:15
Aloha,

om maar weer meteen met de deur in huis te vallen zal ik eerst even een korte situatieschets geven.
Ik heb een form genaamd frmMain, daarop staan 2 panels.. pnlSelect en pnlActiviteit.
Bij de frmMain.Load wordt in beide panels een zelfgemaakte usercontrol geladen. Echter is pnlActiviteit standaard disabled. En nou wil ik dus dat als je in pnlSelect op een knop klikt, dat pnlActiviteit weer enabled wordt.

Om het nog enigszins netjes te houden wilde ik dit via het mainform doen. Dus de geopende usercontrol op pnlSelect roept een procedure op frmMain aan, en die zorgt ervoor dat pnlActiviteit weer enabled wordt. Echter "weet" de usercontrol die in pnlSelect wordt geladen at designtime niet dat hij in pnlSelect geladen wordt, aangezien dit pas at runtime gebeurd. Maar ik vraag me af of het toch mogelijk is om at designtime een form aan te spreken, waarvan ik weet dat het een parentform is, en zodoende ook de functies van frmMain aan te spreken in de usercontrol.

Muchos gracias.

Wanna play?


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:12

mulder

ik spuug op het trottoir

this.FindForm()

oogjes open, snaveltjes dicht


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Zou je dit niet beter met userdefined events kunnen afhandelen? Op die manier kun je je usercontrol ook gebruiken op een ander form. Ik weet niet of en hoe dit kan in VB.NET, maar in VB6 kon dit in elk geval.

  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Je zou het idd beter met events afhandelen.
Op die manier koppel je de afhankelijkheid tussen die 2 user-controls los, en geef je die verantwoordelijkheid aan je main-form. Die is dan verantwoordelijk om die ene user-control te enablen / disablen.

code:
1
2
3
4
5
6
userControl1.SomethingHappened += new EventHandler(DoStuff);

private void DoStuff(object sender, EventArgs e )
{
   userControl2.Enabled = true;
}


bv.
In je main-form hang je dus een event-handler aan je user defined event van je ene user-control, en die event-handler gaat je 2de user control gaan enablen.

[ Voor 40% gewijzigd door whoami op 03-03-2006 10:36 ]

https://fgheysels.github.io/


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 04-04 21:15
Hmmm, ja, maar dan kan ik nog niet de functie ervan gebruiken welke erop staat, aangezien at designtime nog niet bekend is welke functie erbij hoort, maar dit pas at runtime bekend gemaakt wordt. Zodoende kan ik at designtime geen functienaam intypen welke daarbij hoort.
bigbeng schreef op vrijdag 03 maart 2006 @ 10:33:
Zou je dit niet beter met userdefined events kunnen afhandelen? Op die manier kun je je usercontrol ook gebruiken op een ander form. Ik weet niet of en hoe dit kan in VB.NET, maar in VB6 kon dit in elk geval.
whoami schreef op vrijdag 03 maart 2006 @ 10:35:
Je zou het idd beter met events afhandelen.
Op die manier koppel je de afhankelijkheid tussen die 2 user-controls los, en geef je die verantwoordelijkheid aan je main-form. Die is dan verantwoordelijk om die ene user-control te enablen / disablen.

code:
1
2
3
4
5
6
userControl1.SomethingHappened += new EventHandler(DoStuff);

private void DoStuff(object sender, EventArgs e )
{
   userControl2.Enabled = true;
}


bv.
In je main-form hang je dus een event-handler aan je user defined event van je ene user-control, en die event-handler gaat je 2de user control gaan enablen.
Hoe kan ik dan in het mainform die event maken? Ik maak de usercontrol nl. als volgt:
code:
1
2
3
4
5
6
Dim FotoSelect As New ucSelect
FotoSelect .Size = New System.Drawing.Size(132 + SystemInformation.VerticalScrollBarWidth, Me.Height - 33)
pnlSelect.Size = New System.Drawing.Size(FotoSelect .Width, FotoSelect .Height)
FotoSelect .AutoScroll = True
FotoSelect .Parent = pnlSelect
FotoSelect .Show()

En als ik dan een event van de user control wil afvangen, zou ik gokken dat ik dan FotoSelect.Event zou kunnen gebruiken, echter kan ik geen Event intypen bij een usercontrol zo 8)7 Ook als ik ipv FotoSelect ucSelect gebruik lukt het niet.

Bovendien worden at runtime in de usercontrol.load procedure de buttons gemaakt, en wordt dus ook at runtime de buttonhandler toegevoegd aan de button. Dit doe ik op de volgende manier, en die werkt gewoon... (ik heb onnodige dingen zoals Button.Text etc. hieronder ff weggelaten)
code:
1
2
3
Button = New Button
AddHandler Button.Click, AddressOf FotoClick
Me.Controls.Add(Button)

En FotoClick is gewoon een procedure in de usercontrol.

Hoe kan ik het mainform dan at designtime aan events koppelen van controls die at runtime gemaakt worden? Dit gaat toch niet? Of zit er ergens een denkfout?

Wanna play?


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Die event maak je niet in je main-form, maar in je usercontrol.
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class MyUserControl
{
    public event EventHandler SomethingHappened;

    protected void OnSomethingHappened()
    {
           if( SomethingHappened != null )
           {
                SomethingHappened(this, EventArgs.Empty);
           }
    }
}

In je user-control maak je dus een custom event en een method waarmee je die event kan triggeren (zie code - wel nog ff thread-safe maken).
In de event-handler van een click event van een Button die zich op jouw user-control bevind, kan je dus die event gaan triggeren bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public MyUserControl
{
     public event EventHandler SomethingHappened;

     protected void OnSomethingHappened()
     ...

     private void Button1_Click(object sender, EventArgs e )
     {
            OnSomethingHappened();
     }
}

Dit zorgt er dus voor dat jouw custom event uitgevoerd wordt, als je op button1 clicked die zich op jouw user-control bevindt.
Nu moet je er wel nog voor zorgen dat er daadwerkelijk iets gebeurd; je moet dus een eventhandler aan die event koppelen. Dat kan je in je main-form doen, aangezien je mainform zowel usercontrol1 als usercontrol2 kent. (Zie daarvoor de code in m'n eerste post).

https://fgheysels.github.io/


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 04-04 21:15
whoami schreef op vrijdag 03 maart 2006 @ 11:03:
Die event maak je niet in je main-form, maar in je usercontrol.
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class MyUserControl
{
    public event EventHandler SomethingHappened;

    protected void OnSomethingHappened()
    {
           if( SomethingHappened != null )
           {
                SomethingHappened(this, EventArgs.Empty);
           }
    }
}

In je user-control maak je dus een custom event en een method waarmee je die event kan triggeren (zie code - wel nog ff thread-safe maken).
In de event-handler van een click event van een Button die zich op jouw user-control bevind, kan je dus die event gaan triggeren bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public MyUserControl
{
     public event EventHandler SomethingHappened;

     protected void OnSomethingHappened()
     ...

     private void Button1_Click(object sender, EventArgs e )
     {
            OnSomethingHappened();
     }
}

Dit zorgt er dus voor dat jouw custom event uitgevoerd wordt, als je op button1 clicked die zich op jouw user-control bevindt.
Nu moet je er wel nog voor zorgen dat er daadwerkelijk iets gebeurd; je moet dus een eventhandler aan die event koppelen. Dat kan je in je main-form doen, aangezien je mainform zowel usercontrol1 als usercontrol2 kent. (Zie daarvoor de code in m'n eerste post).
Oke, ik ben al een stap verder, want ik snap nu in ieder geval wat je wilt doen, en hoe je het wilt aanpakken. Daarvoor in ieder geval al hartelijk dank! Als ik de code dan vertaal naar VB.NET kom ik op het volgende uit.
in de usercontrol:
code:
1
2
3
4
5
6
7
8
9
10
11
Public Event FotoClick As EventHandler

Protected Sub OnFotoClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
   'If Not (FotoClick Is Nothing) Then
   RaiseEvent FotoClick(sender, e)
   'End If
End Sub

Private Sub ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        OnFotoClick(sender, e)
End Sub

Als ik het quoteteken weghaal, dan krijg ik de volgende foutmelding onder m'n neus:
Public Event FotoClick(sender As Object, e As System.EventArgs)' is an event, and cannot be called directly. Use a 'RaiseEvent' statement to raise an event.
Zodoende dat ik deze ook gecommentarieerd heb om toch de event te raisen...

En in het mainform:
code:
1
AddHandler FotoLogin.FotoClick, AddressOf ZetPanelAan

Waarbij ZetPanelAan een simpele Public Sub ZetPanelAan() is.

Het principe werkt nu, echter ... wat is Thread-Safe? En mag ik wel gewoon altijd de event raisen? Onafhankelijk van of hij leeg is of niet?

Wanna play?


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Je mag de event enkel raisen als hij niet null is, anders zal je een nullref. exception krijgen.
Echter, het kan natuurlijk zijn dat het RaiseEvent statement van VB.NET dat al afvangt; maar dat weet ik niet. 'k Heb nog nooit iets met vb.net gedaan nl.

Ivm thread - safe, check even dit:
[rml]whoami in "[ C#] button.Show() vanuit anderen Thread"[/rml]

Hmm, ik zie trouwens in de MSDN ivm RaiseEvent dit:
The RaiseEvent statement is processed as a call to the Invoke method of the event's delegate, using the supplied parameters, if any.
Dus, ik denk dat die RaiseEvent zelf ook al thread-safe is.

[ Voor 24% gewijzigd door whoami op 03-03-2006 11:56 ]

https://fgheysels.github.io/


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 16:43
VB. Net geeft geen foutmeldingen bij een RaiseEvent zonder handler.

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 04-04 21:15
whoami schreef op vrijdag 03 maart 2006 @ 11:54:
Je mag de event enkel raisen als hij niet null is, anders zal je een nullref. exception krijgen.
Echter, het kan natuurlijk zijn dat het <code>RaiseEvent</code> statement van VB.NET dat al afvangt; maar dat weet ik niet. 'k Heb nog nooit iets met vb.net gedaan nl.

Ivm thread - safe, check even dit:
[rml]whoami in "[ C#] button.Show() vanuit anderen Thread"[/rml]

Hmm, ik zie trouwens in de MSDN ivm RaiseEvent dit:

[...]

Dus, ik denk dat die RaiseEvent zelf ook al thread-safe is.
Eskimootje schreef op vrijdag 03 maart 2006 @ 11:55:
VB. Net geeft geen foutmeldingen bij een RaiseEvent zonder handler.
Dus de code die ik gemaakt heb is thread-safe en geeft geen fouten :) Das mooi om te weten.
Thanx voor jullie snelle respons!

Wanna play?

Pagina: 1