Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C# .NET] Communicatie tussen form en klasse

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

  • the_scientist
  • Registratie: November 2004
  • Laatst online: 15-11-2023
Waarschijnlijk stel ik nu een basic vraag, maar ik ben hier al een dag mee bezig en kom er echt niet uit, ook niet na Googlen en het checken van andere fora.

Ik heb een kleine testapplicatie aangemaakt, waarin ik de "basis" check van de dingen die ik in mijn project wil gebruiken. Nu is het de bedoeling dat mijn project gebruik gaat maken van een klasse. In deze klasse moeten functies komen, die waardes vanuit de eerste form meekrijgen deze opslaan in een variabele, en gaan doorsturen naar het tweede form. Ook is het de bedoeling dat deze variabelen ten alle tijden opgevraagd kunnen worden, de klasse zal dus actief moeten blijven. Maar om de één of andere reden willen de waardes die in het eerste formulier worden verkregen, niet worden doorgespeeld aan de klasse. Even wat code ter verduidelijking:

Form1.cs
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();

               
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class1.stringtest();
        }
    }
}


Class1.cs
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public class Class1
    {
        public static void stringtest()
        {
            string test;
            test = TextBox1.Text;
            MessageBox.Show(test);
        }
    }
}


Wanneer ik TextBox1.Text aanroep in de klasse, kan hij deze ook niet vinden met behulp van het Intellisense menuutje wat tevoorschijn springt. Hopelijk is dit niet al te basic voor GoT, ik wacht in spanning af op de oplossing!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Form1.cs -> regel 18: voorwat dient die string daar?
C#:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();
            //string test = "bla";
               
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class1.stringtest(TextBox1.Text);
        }
    }
}
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public class Class1
    {
        public static void stringtest(string test)
        {
           MessageBox.Show(test);
        }
    }
}

Going for adventure, lots of sun and a convertible! | GMT-8


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 28-11 11:54

Koppensneller

winterrrrrr

Dat hij TextBox1 niet kan vinden is omdat dat een member is van je formklasse, en niet van Class1. Je kunt de gegeven string wel doorgeven aan de functie, op bijvoorbeeld de volgende manier:

C#:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();
            string test = "bla";
               
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class1.stringtest(TextBox1.Text);
        }
    }
}


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public class Class1
    {
        public static void stringtest(string test)
        {
            MessageBox.Show(test);
        }
    }
}


Is dat wat je bedoelde?

  • the_scientist
  • Registratie: November 2004
  • Laatst online: 15-11-2023
Oeps, die hoorde er niet meer in thuis (overblijfseltje van een vorige test m.b.t. implicit conversion). Startpost is aangepast, gelijk even een testrun gedaan om te kijken of die verdwaalde string voor problemen zorgde, maar helaas geen resultaat.

Edit: inderdaad KoppenSneller, dat is waar ik naar op zoek was! Thanks!

[ Voor 13% gewijzigd door the_scientist op 27-10-2007 00:55 ]


  • the_scientist
  • Registratie: November 2004
  • Laatst online: 15-11-2023
Toch niet helemaal, merk ik. Het is namelijk de bedoeling dat de string vanaf een ander form ook op te vragen is. Ik had eigenlijk verwacht dat de variabele door het gehele project gebruikt zou kunnen worden. Om wat duidelijker te zijn:

Form1.cs
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();      
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Class1.stringtest;
        }
    }
}


Form2.cs
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(test);
        }
    }
}


Class1.cs
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public class Class1
    {
        public static void stringtest()
        {
            String test;
            test = TextBox1.Text;
        }
    }
}

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 28-11 11:54

Koppensneller

winterrrrrr

Als je een variabele door het hele project wil gebruiken, kun je er een statische klassemember van je form of een andere klasse van maken. Maar dat is in mijn ogen niet bepaald een nette oplossing, tenzij het configuratieparameters of iets dergelijks zijn. Als je de string gewoon van het ene naar het andere form wil sturen, kun je de constructor van de tweede form aanpassen:

Form1.cs:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();      
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2(TextBox1.Text);
            frm2.Show();
        }
    }
}



Form2.cs:
C#:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
    public partial class Form2 : Form
    {
        private string m_test;

        public Form2(string test)
        {
            InitializeComponent();
            m_test = test;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(m_test);
        }
    }
}


Zo heb je in Form2 de beschikking over dezelfde string. Wil je nou de string vanuit nog meer punten benaderen, of wil je dat wijzigingen naar de string overal worden doorgevoerd, dan kun je toch beter gaan voor de oplossing met een statische member.

  • the_scientist
  • Registratie: November 2004
  • Laatst online: 15-11-2023
Hmm... de oplossing die je gaf schijnt niet te werken, maar waarschijnlijk zoek ik naar die statische memberklasse. De uiteindelijke bedoeling is dat er functies worden aangeroepen wanneer een gebruiker een handeling uitvoert (leavefocus van textbox bijvoorbeeld) die binnen een klasse staan. Gegevens als inlognaam en gebruikersniveau zullen opgeslagen moeten worden binnen die klasse lijkt me, aangezien daar de handelingen worden uitgevoerd.

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 28-11 11:54

Koppensneller

winterrrrrr

Ik heb mijn vorige reply iets aangepast...

  • Forcepoint
  • Registratie: Januari 2007
  • Laatst online: 00:00
C#: Global.cs
1
2
3
4
5
6
7
8
9
using System;

namespace WindowsApplication3.Global
{
     public static class Variables
     {
             public static string Test = "";        
     }
}


C#: Form1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsApplication3 
{ 
    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent();       
        } 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Global.Variables.Test = "TESTT!";
            Form2 frm = new Form2(); 
            frm2.Show(); 
        } 
    } 
}

C#: Form2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsApplication3 
{ 
    public partial class Form2 : Form 
    { 

        public Form2() 
        { 
            InitializeComponent(); 
        } 
        private void button1_Click(object sender, EventArgs e) 
        { 
            MessageBox.Show(Global.Variables.Test); 
        } 
    } 
}


Output: MessageBox -> "TESTT!".

Global.Variables.Test is nu in heel je application te benaderen.
Hopelijk heb je hier wat aan ;)

Groeten,
Francois

[ Voor 0% gewijzigd door Forcepoint op 27-10-2007 11:35 . Reden: code: regels begonnen bij 0... ]


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 17:44

pistole

Frutter

wordt wel smerig als je met threads gaat werken :X

Wat dacht je van het gebruiken van properties?

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:54
Waarom zou je een Windows specifiek iets (MessageBox) gaan oproepen vanuit je 'data'-class ?
Wat is de bedoeling eigenlijk van die class ? Is het enkel om gegevens 'gegroepeerd' bij te houden ?

Heb je al eens in de .NET documentatie gekeken naar classes, properties, constructors ?

Als het je te doen is om gegevens op te slaan over de gebruiker, waarom maak je dan geen gebruik van de mogelijkheden die .NET je daar voor biedt ?IPrincipal, IIdentity, GenericPrincipal, etc...

https://fgheysels.github.io/


  • Forcepoint
  • Registratie: Januari 2007
  • Laatst online: 00:00
pistole schreef op zaterdag 27 oktober 2007 @ 11:38:
wordt wel smerig als je met threads gaat werken :X

Wat dacht je van het gebruiken van properties?
Waar zie jij dan threads?? :|
Properties kan inderdaad ook:
C#: Global.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System; 

namespace WindowsApplication3.Global 
{ 
     public static class Variables 
     { 
             private static string myTest = "";

             public static string Test
             {
                   get { return myTest; }
                   set { myTest = value; }
             }       
     } 
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:54
* whoami vraagt zich trouwens af wat dit in DTE doet.

DTE -> PRG

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:54
Eh, rustig...
pistole zegt gewoon dat het een probleem zal gaan geven als er na verloop van tijd gebruik gemaakt wordt van meerdere threads, waar hij gelijk in heeft.
Gebruik maken van globale variablen of gewone static classes is voor bepaalde doeleinden (en ws ook voor het doel van de topicstarter) gewoon ranzig.

https://fgheysels.github.io/


  • Forcepoint
  • Registratie: Januari 2007
  • Laatst online: 00:00
whoami schreef op zaterdag 27 oktober 2007 @ 11:45:
[...]
Eh, rustig...
pistole zegt gewoon dat het een probleem zal gaan geven als er na verloop van tijd gebruik gemaakt wordt van meerdere threads, waar hij gelijk in heeft.
Gebruik maken van globale variablen of gewone static classes is voor bepaalde doeleinden (en ws ook voor het doel van de topicstarter) gewoon ranzig.
Was niet rottig bedoeld hoor ;)
Ben zelf niet zo ervaren, maar maak toch altijd gebruik van static classes voor dit soort dingen.
Voor simpele applicaties lijkt me dat dit geen problemen zal geven, maar in complexere app's zal dit waarschijnlijk problemen geven idd.
Excuses als het 'aggresief' of 'snauwerig' opgevat werd :)

  • the_scientist
  • Registratie: November 2004
  • Laatst online: 15-11-2023
Thanks voor de reply's tot zover. Deze oplossing werkt, alleen zit mijn probleem voor de uiteindelijke toepassing net wat dieper. Het is de bedoeling dat informatie uit een iterator meegenomen wordt naar het tweede formulier d.m.v. een klasse. De waarde vanuit een form opslaan in een string in een klasse is geen probleem meer, nu wordt het iets lastiger omdat er blijkbaar geen iterator aangemaakt kan worden. Het volgende stukje code staat in de form:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                if (User.LoggedIn)
                {
                    VesselsIterator = (BVesselsIterator)User.BVesselsIterator;
                    if (VesselsIterator != null)
                    {
                        cbxVessel.Items.Clear();
                        VesselsIterator.First();
                        while (!VesselsIterator.EOF)
                        {
                            cbxVessel.Items.Add(VesselsIterator.ID);
                            VesselsIterator.Next();
                        }

                        VesselsIterator.First();
                        cbxVessel.SelectedIndex = 0;
                        cbxVessel.Enabled = true;
                    }
                }


Geen probleem verder, zodra je een druk op de knop geeft wordt de combobox netjes gevuld. Maar het is juist net de bedoeling dat het inlogscherm afsluit wanneer User.LoggedIn een true terugstuurt, en de combobox in het tweede scherm wordt gevuld met informatie. Wanneer ik de code voor het vullen van de combobox in de form_load plaats van het tweede form, en vanuit het eerste form het tweede form aanroep, krijg ik begrijpelijk een foutmelding terug omdat de usergegevens niet zijn meegenomen. Hopelijk is het een beetje duidelijk uitgelegd en kan er een oplossing voor verzonnen worden, wanneer deze info beschikbaar wordt in het tweede form kan ik nl. een groot deel van m'n project afronden.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
Tid toch niet zo moeilijk lijkt me, communicatie tussen klassen kan op verschillende manieren:
- Properties
- Methods
- Events ( Callbacks )
- ...

Kies de vorm die het beste bij de klasse past. Koppelen van een globale data klasse aan een formulier lijkt mij persoonlijk ongewenst magoed.
Maar het is juist net de bedoeling dat het inlogscherm afsluit wanneer User.LoggedIn een true terugstuurt, en de combobox in het tweede scherm wordt gevuld met informatie.
Maak een event in je inlogscherm die wordt afgevuurd als je het formulier afsluit, vanuit de aanroepende klasse kun je die opvangen, de data uit je formulier halen, het formulier opruimen en verder gaan met de logica.

[ Voor 41% gewijzigd door farlane op 27-10-2007 16:26 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1