Toon posts:

[C#] Variabele in form2 zichtbaar maken.

Pagina: 1
Acties:
  • 306 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
In form1 heb ik deze code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Form1 : System.Windows.Forms.Form
{
        // + buttons labels etc...
        public Form f2 = null;

private void button4_Click(object sender, System.EventArgs e)
    {
        if (f2 == null)
        {
            Form2 f = new Form2();
            f2 = f;
            f.Show();
            f.textBox1.Text = "10";
        }

    }

private void button5_Click(object sender, System.EventArgs e)
{
    try
    {
        f2.Close();
        f2 = null;
    }
    catch
    {
        label1.Text = "Error!";
    }
}


Nu wil ik de variabele f2 ook in form2 gebruiken maar ik krijg dit niet voor elkaar. Wat doe ik verkeerd of wat vergeet ik?

Code in form2:

code:
1
2
3
4
5
public void button3_Click(object sender, System.EventArgs e)
{
         this.Close();
         f2 = null; //??
}


Ik heb geloof ik alle NameSpaces al gehad...

[ Voor 7% gewijzigd door Verwijderd op 26-01-2004 10:52 ]


Verwijderd

Verwijderd schreef op 26 januari 2004 @ 01:24:

Code in form2:

code:
1
2
3
4
5
public void button3_Click(object sender, System.EventArgs e)
{
         this.Close();
         f2 = null; //??
}
zou je f2 hier willen gebruiken dan wijst ie toch naar het form zelf, this dus.
Wat wil je bereiken? :)

[ Voor 8% gewijzigd door Verwijderd op 26-01-2004 02:24 ]


Verwijderd

Topicstarter
Vanuit form1 kan ik form2 aanroepen. Maar als deze al bestaat dan mag form2 niet nog eens aangemaakt worden. Vandaar variabele f2.

Maar als ik in form2 "this.Close();" aanroep word mijn variabele in form1 niet null. Dat probeer ik nu te bereiken.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Form2 vuurt enkele events af bij het afsluiten. Als je die opvangt kan je f2 op null zetten.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik zou m'n test in form1 als volgt aanpassen:

code:
1
2
3
4
5
if( f2 == null || f2.IsDisposed )
{
    f2 = new Form2();
    f2.Show();
}


Trouwens, ik vraag me af wat de bedoeling van die code is? Wil je dat er slechts 1 instance van form2 actief kan zijn?
Je kan ook f2 modaal tonen.

https://fgheysels.github.io/


  • Sharkware
  • Registratie: November 2003
  • Laatst online: 17-05 01:10
Je kunt ook Form1 in je tweede form includen.
<include "Unit1.h"> (ofzoiets)
en dan in je code "Form1.f2" gebruiken.

Zo zou het tenminste in c++ werken volgens mij.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Sharkware schreef op 26 januari 2004 @ 11:57:
Je kunt ook Form1 in je tweede form includen.
(ofzoiets)
en dan in je code "Form1.f2" gebruiken.

Zo zou het tenminste in c++ werken volgens mij.
C++ is niet hetzelfde als C#, en dat is ook het probleem niet.
De TS wil vanuit form2 aan een member variabele geraken van form1, en dat kan je niet als je geen instance van form1 in form2 hebt.

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
in vb.net kan je een module aanmaken.
hier kan je je variabelen declareren d.m.v.
public dim a as string
deze is dan door je hele applicatie benaderbaar.
Ongetwijfeld zal c# dit ook wel hebben.

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


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Remc0 schreef op 26 januari 2004 @ 13:42:
in vb.net kan je een module aanmaken.
hier kan je je variabelen declareren d.m.v.
public dim a as string
deze is dan door je hele applicatie benaderbaar.
Ongetwijfeld zal c# dit ook wel hebben.
Nee zoiets bestaat niet in C# op die manier.

Als je wilt dat er maar een instantie van Form2 is dan kan je natuurlijk wel gebruik maken van een vorm van het Singleton pattern.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Remc0 schreef op 26 januari 2004 @ 13:42:
in vb.net kan je een module aanmaken.
hier kan je je variabelen declareren d.m.v.
public dim a as string
deze is dan door je hele applicatie benaderbaar.
Ongetwijfeld zal c# dit ook wel hebben.
De vraag is, wil je dat wel?
Globale variabelen maken je applicatie in de meeste gevallen moeilijker beheersbaar. Daarnaast kan je globale variablen ook meestal vermijden.

In dit specifieke geval, vraag ik me trouwens ook af of de topicstarter zijn 'probleem' niet op een andere, en nettere manier kan gaan oplossen. Ik vind de bedoeling nl. nogal wat 'wazig'.

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Tja, ik wil dat wel. :-)
Aangezien ik niet weet hoe ik kan controleren of er al een form actief is.
En het programma is vrij klein, dus qua overzicht zal het wel meevallen.
Ik had ook al een tijdje zitten zoeken, dus dan maar met een global variabele.

Maar ik hou me aanbevolen voor een manier, om te kijken of er een form al actief is in een mdi-applicatie. Dat zou inderdaad netter wezen.

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


Verwijderd

Topicstarter
Ik wil het wel op een nettere manier oplossen maar volgens mij is dit de enige (pin me er niet op vast na 2 dagen C# ervaring).

Het is gewoon een form die je naast de main form kan gebruiken. Deze mag maar één keer aangemaakt worden.
Je kan deze zowel op de main form sluiten als op de form zelf.

Ik zit nu te zoeken naar de manier waarop ik dat event moet implementeren.
Ik neem aan dat het event automatisch getriggerd wordt als form2 sluit.
Maar zit je dan niet met hetzelfde probleem dat je weer een instantie van form2 nodig hebt?
In form1 zou namelijk de event van het sluiten van form2 afgehandeld moeten worden. Of kan je hiervoor weer f2 gebruiken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kan een delegate aanmaken in form2, die getriggered wordt in de onClose event van form2, en verwijst naar een method op form1:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Form2 : form
{
    public System.EventHandler DoAfterClose;
   
    ....

    public void Form_Closed(object sender, System.EventArgs e )
    {
        if( DoAfterClose != null )
        {
              DoAfterClose(this, null);
        }
    }
}


code:
1
2
3
4
5
6
7
8
9
10
11
private void Button1_Click( object sender, EventArgs e)
{
     f2 = new Form2();
     f2.DoAfterClose += new System.EventHandler(DoAfterF2Closed);
     f2.Show();
}

private void DoAfterF2Closed(object sender, System.EventArgs e)
{
     this.f2 = null;
}



Voor meer informatie kan je ook even deze post lezen:
[rml]whoami in "[ VB.NET] waardes van een andere form?"[/rml]

Daarnaast geloof ik dat er wel andere/betere manieren bestaan om te checken of er reeds een instance van een bepaalde form actief is. Ik zal dat vanavond eventueel eens uitpluizen.

[ Voor 19% gewijzigd door whoami op 26-01-2004 14:55 ]

https://fgheysels.github.io/


  • lier
  • Registratie: Januari 2004
  • Laatst online: 22:27

lier

MikroTik nerd

Is het niet een oplossing om een referentie van form1 mee te geven aan form 2 ?

Dit door middel van "= new Form2(this);".

Eerst het probleem, dan de oplossing


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
lier schreef op 26 januari 2004 @ 15:02:
Is het niet een oplossing om een referentie van form1 mee te geven aan form 2 ?

Dit door middel van "= new Form2(this);".
Als form1 de owner is van f2, dan kan je idd in form2 de owner property uitlezen, en die casten naar form1:
code:
1
((Form1)this.Owner).f2 = null;

https://fgheysels.github.io/

Pagina: 1