Pop-up form

Status
Niet open voor verdere reacties.

goedlichtJoost

Gebruiker
Lid geworden
7 mrt 2012
Berichten
477
Hallo allemaal,

Ik zou graag het volgende realiseren.

Ik heb een main form, waarbij de gebruiker een aantal waardes invult en vervolgens op een knop duwt om het programma te starten met de ingevulde waardes (functie van programma doet er even niet toe).

Nu zou ik graag een extra knop willen toevoegen welke een nieuw form opent (dus over het 1e form) waar nog meer informatie toegevoegd kan worden (extra informatie). Op dit form zijn dus een aantal invul velden en een "return" knop, welke het pop-up form afsluit en de gebruiker dus weer terug laat keren naar het main-form.

Natuurlijk is het hierbij belangrijk dat de ingevulde gegevens gebruikt kunnen worden in de applicatie zelf.
Het draait hierbij natuurlijk om de verwijzing naar de ingevulde waardes op form2, vanuit form1.

Nu weet ik niet precies hoe ik dit moet gaan aanpakken,
Iemand die mij kan vertellen hoe ik dit ongeveer moet gaan aanpakken?

Met vriendelijke groeten

Joost
 
Laatst bewerkt:
Oke het is alweer opgelost:
Forms starten kan via:
Hide en Show : Application.OpenForms["Form2"].Hide();

Het uitwisselen van data doe je door desbetreffende textbox/combobox op public te zetten en dan het form te declareren in je main form: public Form2 frm2 = new Form2();

Excuses moderator voor het tweemaal posten van een topic waar ik zelf tot een oplossing ben gekomen.
U kunt ze wat mij betreft verwijderen, of laten staan om andere mensen ermee te helpen

Met vriendelijke groeten

Joost
 
Eigenlijk is het 'public' maken van controls in een form een slechte manier.
Je kan beter een property maken zoals het volgende voorbeeld:

Code:
public String TekstVanTextBox
{
     return TextBox1.Text; 
}

Dan kan je gewoon:
Code:
String tekst = frm2.TekstVanTextBox;

in plaats van:
Code:
String tekst = frm2.TextBox1.Text;
 
Hallo MatthiWare,

Bedankt voor je reactie, je moet je form dan wel public maken om de functies te benaderen toch?
Wat is hiervan eigenlijk het grote voordeel van dan? Of is dit gewoon een ongeschreven regel binnen C#?
Wat je dus eigenlijk voorstelt is in mijn pop-up form maak ik van alle checkboxen/textboxen/comboboxen een uitlees functie welke simpel direct een waarde returnt, deze functies voer je dan uit in mijn main?

Ik ga het veranderen!

Met vriendelijke groeten

Joost
 
MatthiWare,

Klopt het dan dat ik voor de "beveiliging" (wanneer ik altijd een positief heel getal wil uitlezen uit het textbox) beter dit kan gebruiken?

Code:
        public uint hoogteraveling()
        {
            try
            {
                return uint.Parse(txtbxhoogteHraveling.Text);
            }
            catch (Exception)
            {
                return 0;
            }
        }

Of kan ik dan beter een NULL returnen? en dan iets in de main als:
Code:
        try
        {
            uint hoogterav = frm2.hoogteraveling();
        }
        catch(NULL)
        {
            MessageBox.Show("verkeerde waarde ingevuld");
            //Hier iets waardoor het programma dus stopt om het aan te passen
        }

Met vriendelijke groeten,

Joost
 
Je form moet niet public zijn om de functies te benaderen, gewoon in je andere form hem declareren:
Code:
Form2 frm2 = new Form2();

Of bedoel je dat je vroeger deze code gebruikte?
Code:
Application.OpenForms["Form2"]

Het meest veilige lijkt me het eerste voorbeeld
 
Nee klopt je hebt gelijk, ik gebruik inderdaad jou eerste voorbeeld: Form2 frm2 = new Form2();

En hoe zit het met de try-catch methode, is dit het makkelijkste om mijn programma te beschermen tegen foutieve invoer in de textboxen?
 
Het beste is dat je geen try-catch methodes gebruikt in de functie/property/methode maar wel if-statements om dan de waarde te checken en deze aan te passen of een aangepaste exception throw'en.

zoals in het volgende voorbeeld:
Code:
/// <summary>
/// Deelt 5 door een getal
/// </summary>
/// <exception cref="ArgumentNullException" />
/// <exception cref="DivideByZeroException" />
/// <param name="deler">getal waar door te delen</param>
/// <returns>5 / deler</returns>
double Deel5Door(int deler)
{
    double returnWaarde = null;

    if (deler == null)
        throw new ArgumentNullException("deler", "Geen waarde voor de deler gevonden");
    
    if (deler == 0)
        throw new DivideByZeroException("Je kan 5 niet delen door 0");

    returnWaarde = 5 / deler;

    return returnWaarde;
}

in plaats van:
Code:
double Deel5Door(int deler)
{
   double returnWaarde = null;
   try
   {
       returnWaarde = 5 / deler;
   }
   catch (exception)
  {
      return 0;  
  }
}

Dan kan je een aangepaste try - catch - statement plaatsen waar je de code aanroept,
Dan moet je eerst de xml-summary bekijken en daaruit kan je dan zien dat de 'Deel5Door(int deler)' 2 mogelijke exceptions heeft:
OkKWJ.png

- ArgumentNullException
- DividedByZeroException
Code:
VOORBEELD1:
try
{
   Double d1 = Deel5Door(0);       // <- Deze geeft DividedByZeroException.
   Double d2 = Deel5Door(10);     // <- Deze zou moeten werken.

   int deler = null;
   Double d3 = Deel4Door(deler);  // <- Deze geeft ArgumentNullException
}
catch (ArgumentNullException argNullEx)
{
   MessageBox.Show("Kan 5 niet delen door de opgegeven waarde \n omdat de opgegeven waarde niets is. \n \n" + argNullEx.Message, "Argumenten ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (DividedByZeroException divBy0Ex)
{
   MessageBox.Show("Kan 5 niet delen door 0. \n \n" + argNullEx.Message, "Argument is 0 ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
 
Of:

Code:
Form2 frm2 = new Form2();
frm2.ShowDialog();

Daarnaar kun je alle berekeningen etc gewoon in Form2 doen en dan strings, etc en andere waarde die je nodig hebt in Form1 kun je dan als volgt ophalen:

Code:
string Waarde = frm2.MijnString;
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan