van forms switchen

Status
Niet open voor verdere reacties.

Zakelijk

Gebruiker
Lid geworden
13 mei 2009
Berichten
9
Beste programeurs,

Ik heb hulp nodig met 2 verschillende forms.
Ik heb een main form genaamd form1 en een soort van sub form genaamd form2
je kunt het vergelijken met een spel:
form1 als een character.
en form2 als een soort van venster waarin je je character in form1 kunt upgraden.
dus de twee forms moeten met elkaar kunnen communiceren. wat ik eigenlijk wil is dat als ik button1 in form1 aanklik, dat form1 onzichtbaar word, dus gaat hiden.. en dat form2 tevoorschijn komt. en als ik in form2 bijvoorbeeld button2 aanklik, dat form2 gaat hiden en form1 tevoorschijn komt.. om form2 aan te roepen kan ik de volgende stukje code gebruiken bij een buttonclick in form1
Code:
Form2 form2 = new Form2();
form2.Show();
this.Hide();
en om form1 weer terug te halen kan ik dit gebruiken bij een buttonclick in form2
Code:
Form1 form1 = new Form1();
form1.Show();
this.Hide();


Maar het probleem hierbij is dat er telkens nieuwe forms aan worden gemaakt en dat ik alle informatie kwijt raak in mijn orginele form.
heeft iemand een andere manier waarbij ik van deze forms kan switchen zonder dat ik het opnieuw aanmaak en dus alle info kwijtraak?

Als je vind dat er een andere manier hiervoor beter schikt, hoor ik het graag!

Alvast bedankt.
 
Aha, hier komt de beauty van het principe model-view-controller te voorschijn.
Je moet dus een stuk code hebben die beide forms beheerd.

bv: Je hebt vast iets van een mainform die als eerste opstart.
Deze creeert een klasse controller:

Hieronder heb ik uit mijn hoofd gedaan, niet getest, in in notepad ingetypd.
Er kunnen dus fouten in zitten, maar ik denk dat je het principe wel doorhebt.
Controller word meegegeven aan de forms welke dan de changeState(state) aan
kunnen roepen om te switchen.

Code:
Public Enum State
 None
 Details
 Generic
End Enum

Public class Controller

 Private formDetails as Form2 = Nothing
 Private formGeneric as Form1 = Nothing

 Pubic Sub new
  LoadForms()
 end sub

 ' Creating the forms
 Private Sub LoadForms()
  formDetails = New form2(this)
  formGeneric = New form1(this)
   
 End Sub

 Public Sub ChangeState(state as State)
  Select case state
   Case None:
    formDetails.Hide()
    formGeneric.Hide()
   Case Details:
    formDetails.Show()
    formGeneric.Hide()
   Case Generic:
    formDetails.Hide()
    formGeneric.Show()
  End Select
 End Sub

End Class
 
Code:
Public Enum State
 None
 Details
 Generic
End Enum

Public class Controller

 Private formDetails as Form2 = Nothing
 Private formGeneric as Form1 = Nothing

 Pubic Sub new
  LoadForms()
 end sub

 ' Creating the forms
 Private Sub LoadForms()
  formDetails = New form2(this)
  formGeneric = New form1(this)
   
 End Sub

 Public Sub ChangeState(state as State)
  Select case state
   Case None:
    formDetails.Hide()
    formGeneric.Hide()
   Case Details:
    formDetails.Show()
    formGeneric.Hide()
   Case Generic:
    formDetails.Hide()
    formGeneric.Show()
  End Select
 End Sub

End Class

dat is basic als ik me niet vergis? ik wil graag C# hebben :)
 
Laatst bewerkt:
Ach maakt niet veel uit, maar je snapt het idee?
De syntax is verschillend, maar de libraries zijn
beide van het .NET framework.

Als je dan toch bezig bent, kijk dan ook meteen even naar
de Observer pattern. Deze kun je hiervoor prima gebruiken.

Klein voorbeeld:

PHP:
    public enum State
    {
	Form1Active,
	Form2Active
    }

    public interface IObserver
    {
        void Update(State state);
    }

    public interface ISubject
    {
        List<IObserver> Observers
        {
            get;
            set;
        }

        void Attach(IObserver observer);

        void Detach(IObserver observer);

        void Notify(State state);
    }

    public class Engine : ISubject
    {
	private List<IObserver> observers = new List<IObserver>();
        private Form1 frm1;
        private Form2 frm2;

        #region Instance of SimulationEngine to support singleton 
        public static Engine Instance = new Engine();

        private Engine() { Init(); }
        #endregion

        #region ISubject Members

        public List<IObserver> Observers
        {
            get
            {
                return observers;
            }
            set
            {
                observers = value;
            }
        }

        public void Attach(IObserver observer)
        {
            observers.Add(observer);
        }

        public void Detach(IObserver observer)
        {
            observers.Remove(observer);
        }

        public void Notify(State state)
        {
            if (observers.Count == 0) return;

            foreach (IObserver observer in observers)
            {
 	  	observer.Update(state);
            }
        }

        #endregion
    	
	private void Init()
        {
	    frm1 = new Form1();
	    frm2 = new Form2();
	    Attach(frm1);
	    Attach(frm2);

	    Notify(Form1Active)
	}

	public void ChangeState(State state)
	{
	    // Wat je maar wilt valideren o.i.d
	    Notify(state)
	}

    }

    Zorg voor 2 windows forms met elk een knop om op te klikken.
    Ik licht alleen even de belangrijkste functies eruit, ctor e.d moet
    je zelf even doen.
    
    public class Form1 : Form, IObserver
    {
	private State currentState;	 

       	public void Update(State state)
       	{
	    currentState = state;
	    UpdateForm()
       	}

	public void UpdateForm()
	{
	   if (currentState == State.Form1Active)
	   {
		this.Show();
	   }
	   else 
	   {
		this.Hide();
	   }
	}

	private void Button1_Click(Object source, EventArgs e)
	{
	   // Dit is niet de netste manier, eigenlijk moet je het event doorgooien
	   // naar de engine. Deze bepaalt vervolgens in welke state iedereen komt.
           // Duurde me te lang om dat in notepad uit te gaan werken.
	   Engine.Instance.ChangeState(State.Form2Active);
	}
    }

    public class Form2 : Form, IObserver
    {
	private State currentState;	 

       	public void Update(State state)
       	{
	    currentState = state;
	    UpdateForm()
       	}

	public void UpdateForm()
	{
	   if (currentState == State.Form2Active)
	   {
		this.Show();
	   }
	   else 
	   {
		this.Hide();
	   }
	}

	private void Button1_Click(Object source, EventArgs e)
	{
	   // Dit is niet de netste manier, eigenlijk moet je het event doorgooien
	   // naar de engine. Deze bepaalt vervolgens in welke state iedereen komt.
           // Duurde me te lang om dat in notepad uit te gaan werken.
	   Engine.Instance.ChangeState(State.Form1Active);
	}
    }
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan