[VB.net] mdi-child openen vanuit ander child

Pagina: 1
Acties:

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
Ik heb een mdi-applicatie waarin registraties van activiteiten worden vastgelegd.
Na een bepaalde periode moeten deze activiteiten eerst "geaccepteerd" worden, voordat er weer registraties ingevoerd mogen worden.

Nu laat ik in de startup van mijn mdi-parent een if..then uitvoeren, die afhankelijk van of er wel of niet "geaccepteerd" moet worden een child-form opent.

Dit werkt uiteraard helemaal top.
Echter....

Ik heb 2 childs. (registratie en acceptatie)
Ik wil dat als de child acceptatie word afgesloten de child registratie word opgestart.
(ik kan het form wel openen, maar het lukt me niet om hem/haar als child van de parent te openen.)

Hoe ga ik dat doen ?

Ook kan ik als oplossing gebruiken om de form_load van de parent opnieuw te draaien, maar wat ik ook probeer het resulteerd altijd in foutmeldingen bij het compilen (waarschijnlijk omdat het niet bestaat ;) )

[ Voor 11% gewijzigd door Remco op 30-12-2003 16:22 ]

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Remc0 schreef op 30 december 2003 @ 16:21:

Ik heb 2 childs. (registratie en acceptatie)
Ik wil dat als de child acceptatie word afgesloten de child registratie word opgestart.
(ik kan het form wel openen, maar het lukt me niet om hem/haar als child van de parent te openen.)
Is die form dan wel een MDIChild ?

Je kan in je main_form een method schrijven die je registratie-child gaat gaan openen.
Die functie ziet er bv zo uit:
code:
1
2
3
4
5
private void ShowRegistratieForm(object sender, System.EventArgs e )
{
      RegisterForm frmReg = new RegisterForm();
      frmReg.Show();
}


Dan moet je er gewoon voor zorgen dat die method uitgevoerd wordt als je op OK hebt geklikt in je Acceptatie-form. Dit kan je bekomen door gebruik te maken van delegates/events.

Neem dus in je Acceptatie-form een delegate of een event op dat getriggered wordt als je op OK klikt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class AcceptForm : Windows.Form
{

     ....
     public event DoAfterOk;
     ....

     public void OKButton_OnClick(object sender, System.EventArgs e)
     {
         ....
         if( DoAfterOk != null )
         {
              DoAfterOk(sender, e);
         }
     }

}


Het enige dat je nu nog hoeft te doen, is de method ShowRegistratieForm koppelen aan die event als je dus je AcceptForm gaat gaan tonen
frmMain
code:
1
2
3
4
5
6
if( ShowAcceptForm == true )
{
       AcceptForm frmAccept = new AcceptForm();
       frmAccept.DoAfterOk += new EventHandler(ShowRegistratieForm);
       frmAccept.Show();
}


Op dergelijke manier zorg je ervoor dat je forms van elkaar losgekoppeld zijn. Als je in AcceptForm bv. hard zou gaan coderen dat RegistratieForm moet getoond worden, dan kan je die AcceptForm niet meer gaan hergebruiken in situaties waar je RegistratieForm niet moet tonen als AcceptForm afgesloten wordt.


Ik denk trouwens dat je -als je het niet op bovenstaande manier wilt doen- ook kunt oplossen door expliciet de Owner van RegistratieForm op de MainForm te zetten:
code:
1
2
RegisterForm frmReg = new RegisterForm();
frmReg.Owner = frmMain;

Je gaat nl. je form gaan openen vanaf je Acceptatie-Form, en dan wordt die Acceptatie-Form automatisch de parent.


edit:
Zoals je kunt zien is dit C# code, en geen VB.NET code, maar je kan gebruik maken van dezelfde principes. Hoe de syntax is in VB.NET zal je zelf moeten uitvogelen.

[ Voor 23% gewijzigd door whoami op 30-12-2003 16:46 ]

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
Ik heb je verhaal gelezen, en diverse dingen geprobeert, maar ik krijg het niet voor elkaar.
Ik weet ook niet helemaal zeker of je precies begrijpt wat ik wil.

Ik heb drie forms:
frm_start (mdi parent form) (startup van het project)
frm_acceptatie (mdi child form)
frm_registratie (mdi child form)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'Stukje code uit de load van frm_start

'check of bepaalde datum aan voorwaarden voldoet.
'i is een integer, dat is een tellertje voor de voorwaarden

If i > 0 Then
            Dim frm_acceptatie As New frm_acceptatie
            frm_acceptatie.MdiParent = Me
            frm_acceptatie.Show()
        Else
            Dim frm_registratie As New frm_registratie
            frm_registratie.MdiParent = Me
            frm_registratie.Show()
 End If
'dit werkt prima allemaal

Als frm_acceptatie dus gestart word, dan moet de gebruiker een aantal handelingen verrichten om bepaalde data te accepteren.
frm_acceptatie eindigt dan uiteindelijk als volgt.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
'dit is dus code uit frm_acceptatie

 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button5.Click

'En hier moet dan de code komen om frm_registratie
'te openen.
'Maar wel als child van frm_start

End Sub


Ik krijg het wel voor elkaar om frm_registratie te openen, maar dan is het geen child van frm_start.

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Remc0 schreef op 30 december 2003 @ 18:58:
Ik heb je verhaal gelezen, en diverse dingen geprobeert, maar ik krijg het niet voor elkaar.
Ik weet ook niet helemaal zeker of je precies begrijpt wat ik wil.

Ik heb drie forms:
frm_start (mdi parent form) (startup van het project)
frm_acceptatie (mdi child form)
frm_registratie (mdi child form)
Ik begrijp wat je wilt, en met die methode zou het imo moeten mogelijk zijn om het werkend te krijgen.
Met die delegate op je acceptatie form (frm_acceptatie) geef je nl. aan dat een methode die zich op frm_start bevind moet uitgevoerd worden.
Die methode gaat frm_registratie gaan openen.
[/code]
Als frm_acceptatie dus gestart word, dan moet de gebruiker een aantal handelingen verrichten om bepaalde data te accepteren.
frm_acceptatie eindigt dan uiteindelijk als volgt.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
'dit is dus code uit frm_acceptatie

 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button5.Click

'En hier moet dan de code komen om frm_registratie
'te openen.
'Maar wel als child van frm_start

End Sub


Ik krijg het wel voor elkaar om frm_registratie te openen, maar dan is het geen child van frm_start.
Wat logisch is, aangezien je frm_registratie opent vanaf frm_acceptatie; frm_acceptatie zal dus de parent en de owner zijn van frm_registratie.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Ik heb nu ff vlug een testje gedaan, en het is betrekkelijk eenvoudig te verwezenlijken (zonder delegates te gebruiken. :o )

Zet deze code achter je Button_Click op je acceptatie-form:
code:
1
2
3
4
5
6
7
8
9
private void OkButton_Click( object sender, System.EventArgs e )
{
        frmRegistratie        frmReg;
 
        frmReg = new frmRegistratie();
        frmReg.MdiParent = this.MdiParent;
        frmReg.Show();
        this.Close();
}

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
tnx, hier was ik dus zo'n 4 uur mee bezig _/-\o_

Hier nogmaals de code in vb
Visual Basic:
1
2
3
4
        Dim frmReg As New frm_registratie
        frmReg.MdiParent = Me.MdiParent
        frmReg.Show()
        Me.Close()

Voor de naslag:

Deze code zorg er dus voor om een nieuw child-form in een mdi-applicatie te openen vanuit een ander child-form, en de huidige te sluiten.

The best thing about UDP jokes is that I don't care if you get them or not.

Pagina: 1