event bij form.Show

Status
Niet open voor verdere reacties.

goedlichtJoost

Gebruiker
Lid geworden
7 mrt 2012
Berichten
477
Hallo allemaal,

Ik heb een vraagje over wanneer er gewerkt wordt met twee forms.

Ik heb een main form, waarbij er verschillende textboxen ingevuld kunnen worden.
Er kan vervolgens op een button geklikt worden waardoor form2 te voorschijn komt.
Nu maakt form 2 gebruik van waardes uit de ingevulde textboxen. (in de vorm van labels die de eerder ingevulde waardes laten zien)
form twee heeft ook meerdere knoppen en ik kan natuurlijk maken bij de click-event van een button, dat de labels de waarde krijgen uit de tekstboxen.
Echter zou ik graag hebben dat deze waardes al tijdens het openen van het form te voorschijn komen.

Nu heb ik geprobeerd om de waardes al op te halen bij InitializeComponent(); maar volgens mij wordt het form al geïnitialiseerd tijdens de run, en zijn de waardes in de tekstbox dus nog 0/leeg.

Is het mogelijk om een event te maken die deze waardes ophaalt wanneer het form wordt geshowed?(op dit moment zijn namelijk de tekstboxen al ingevuld).

Ik hoop dat bijgevoegde code, mij probleem duidelijker illustreert:

Code:
public Form2()
        {
            InitializeComponent();
            label1.Text = Form1.textbox1.ToString();
        }

///^ Geeft dus altijd een 0

public void buttonverder_Click(object sender, EventArgs e)
        {
           label1.Text = Form1.textbox1.ToString();
        }

/// ^ geeft de ingevulde waarde van textbox van form1

Ik roep form2 aan op de volgende manier:
Code:
Form2.Show();


Graag uw advies in deze!

Alvast bedankt,

Groeten Joost
 
Je controls kunnen in principe gewijzigd worden na de initialize component method call in de constructor, tevens kun je dingen doen in het form_load event wat gebeurt vlak voordat het form aan de gebruiker wordt getoont. Op dit punt kun je ook handelingen doen in het form_shown event.

Dit kan een tijdelijke oplossing zijn voor je probleem. Maar de manier waarop je data op en neer stuurt is in principe niet gewenst (form1.textbox.text aanroepen in form2). Het public maken van controls is alleen gewenst als je 'inherit' van een ander form.
Je kunt dit scherm ook nu alleen maar in combinatie met Form1 gebruiken en als je dingen in je Form1 aanpast is de kans ook aanwezig dat je dit form moet wijzigen. Er zijn meerdere manieren om dit te voorkomen.


In dit voorbeeld heb ik gewoon een class met wat dingen zoals een naam, omschrijving, kleur etc die ik aan form2 geef. Deze is dan te wijzigen en daarna door form1 terug te halen doormiddel van een property.

Bijgevoegd een voorbeeld:
dd1fyx.png

Voorbeeld: http://dl.dropbox.com/u/63676419/TransferData.rar

(zoals gewoonlijk, voorbeeld code niet optimaal :P)
 
Bloodshed,
Hartstikke bedankt voor uw reactie (ook in andere topics), wat moet helpmij op C# gebied zonder jou haha.

Ik heb je voorbeeld bekeken en heb daar nog een aantal vragen over:

1. Ik zie dat je gebruik maakt van een "standaard" voor de te versturen gegevens, en hiervoor heb je een apparte class aangemaakt? Ik weet niet precies hoe dit werkt, in je class maak je eerst de verschillende variabelen aan, vervolgens een lege versie van de variabelen lijst? En de onderste is dan, voor het aanmaken ofzo?
Code:
public Preferences()
            : this("", "", "White", Alignment.Horizontal)
////^dit heeft iets te maken met wanneer er een lijst doorgegeven wordt?

public Preferences(string name, string description, string color, Alignment alignment)
        {
            Name = name;
            Description = description;
            Color = Color.FromName(color);
            Alignment = alignment;
        }

//////^en dit heeft iets te maken wanneer er een lijst wordt aangemaakt? dus in het preferenceview.form?

2. je opent je 2e form doormiddel van deze code
Code:
var preferencesView = new PreferencesView(_myPreferences);

            if (preferencesView.ShowDialog() == DialogResult.OK)
            {
                _myPreferences = preferencesView.Preferences;
                SetControls(_myPreferences);
            }

            preferencesView.Dispose();
Echter snap ik niet zo goed wat hier gebeurt, je maakt een nieuw preferenceview aan, (dit is gewoon een nieuw form dan ofzo?) en dan stuur je daar de lijst van jou waardes mee?
En dan doe je een controle of het dialogresult = OK, dit heeft dan toch te maken met als het afgesloten wordt? dan zet jij hem op OK (dus de goede knop geselecteerd op form2?)
dan update je de locale variabele _myPreference, met de lijst van in form2. En dan doe je weer net zoals bovenaan, je waardes vanuit de lijst naar de textboxen plaatsen.
Vervolgens gooi je het totale form weer weg? Dit omdat je hem dan opnieuw kan starten ofzo?

Ik probeer echt in dit project zo goed mogelijk via de "C#-code regels" te werken, en ik gebruik veel van je eerder genoemde oplossingen. Maar nog steeds lijkt een project bij mij, niet in de verste verte op jou programma's.

code als:
Code:
var alignment = rbHorizontal.Checked ? Alignment.Horizontal : Alignment.Vertical;
zegt mij niet heel veel, natuurlijk snap ik uiteindelijk wel dat er bedoeld wordt: als horizontaal is gecheckt, dan is de alignment horizontal, en anders is de alignment vertical. Maar zo zou ik dit niet zelf kunnen bedenken.

mvg

Joost
 
1.
De preference class heeft 2 constructors in dit geval. Twee manieren om een preference object te maken. Bij een kun je alle waardes waarmee je wilt dat de class begint invullen en de andere vul je niets in maar zorgt de class zelf voor wat default values. (heb ik hier gedaan zodat ze allemaal een waarde hebben en niet null zijn)

2.
Een form kun je gewoon zien als een class.

Dan stuur ik inderdaad gewoon een preference mee (die op het main view een private variable is). Vanaf hier doet het mainview er niets meer mee en gebruikt het preferenceview de preference class en past deze aan naar behoren. Zodra je daar op OK klikt wijzigd hij de waarde van de preference class properties aan de hand van wat je invult. Daarna kan je weer op je mainview doormiddel van preferencesView.Preferences deze class terug halen en koppelen aan je private variable op je mainview.

Nadat je je form niet meer nodig hebt moet je het inderdaad weggooien, in dit geval Dispose, kunt hem daarna ook nog even op null zetten (hier vergeten zie ik).

3.
Code:
var alignment = rbHorizontal.Checked ? Alignment.Horizontal : Alignment.Vertical;

dit is hetzelfde als

Code:
var alignment;
if(rbHorizontal.Checked)
{
	alignment = Alignment.Horizontal;
}
else
{
	alignment = Alignment.Vertical;
}

Zoals in eerdere projecten bv is een Beam class ook gewoon hetzelfde als de Preference class. Je maakt een aantal objecten aan wat je nodig hebt. Je moet de preference class gewoon zien als wat waardes die gemakkelijk ik een pakketje zitten (deze waardes horen ook bij elkaar)

Zoals een Fiets class bv een Merk, Typenummer, Dames/Heren properties zal hebben.


Groet
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan