V prvom rade, nesúvisí to síce s problémom, ale ak nemáš naozaj dobrý dôvod, skús sa naučiť radšej WPF a nie winforms... Mnoho vecí sa tam rieši jednoduchšie, prehľadnejšie atď.
A čo sa týka tejto tvojej dilemy....
Tých spôsobov, ako to dosiahnuť, je relatívne veľa. Napríklad môžeš využiť podobnú techniku ako teraz, tj. budeš mať definovaný event, pričom ho budeš obsluhovať vo forme1. Rozdiel bude v tom, že nepoužiješ EventArgs, ale vytvoríš si nejaké custom argumenty, napr NavigationArgs... Menší náčrt, ako to myslím:
Kód:
public enum MyControl
{
UserControl1, UserControl2
}
public class NavigationArgs
{
public MyControl NavigateToControl { get; private set; }
public NavigationArgs(MyControl target)
{
NavigateToControl = target;
}
}
náčrt Form1
Kód:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected void Form1_Load(object sender, EventArgs e)
{
UserControl1 control1 = new UserControl1();
ChangeControlTo(control1);
}
protected void ChangeControlTo(ICustomControl control)
{
// todo: tu by bolo fajn zistiť, či je v paneli nejaký custom control a ak áno, odstrániť event handler (control.PerformNavigation -= performNavigation),
// prípadne aj zavolať dispose atď... podľa potreby
control.Dock = DockStyle.Fill;
control.PerformNavigation += performNavigation;
panel1.Controls.Clear();
panel1.Controls.Add(control);
}
protected void performNavigation(object sender, NavigationArgs e)
{
ICustomControl control;
switch (e.NavigateToControl)
{
default:
case MyControl.UserControl1:
control = new UserControl1();
break;
case MyControl.UserControl2:
control = new UserControl2();
break;
}
ChangeControlTo(control);
}
}
jednoduchý interface:
Kód:
public delegate void PerformNavigationHandler(object sender, NavigationArgs e);
public interface ICustomControl
{
event PerformNavigationHandler PerformNavigation;
}
a implementácia, napr CustomControl1 a 2
Kód:
public partial class UserControl1 : UserControl, ICustomControl
{
public event PerformNavigationHandler PerformNavigation;
protected void button1_Click(object sender, EventArgs e)
{
if (PerformNavigation != null)
PerformNavigation(this, new NavigationArgs(MyControl.UserControl2));
}
}
public partial class UserControl2 : UserControl, ICustomControl
{
public event PerformNavigationHandler PerformNavigation;
protected void button1_Click(object sender, EventArgs e)
{
if (PerformNavigation != null)
PerformNavigation(this, new NavigationArgs(MyControl.UserControl1));
}
}
Len upozorňujem, je veľa hodín, netestol som to, môžu tam byť chyby, ale hádam ti to dá cca nápad, ako sa to dá zrealizovať...
Samozrejme si treba uvedomiť, že pri tomto prístupe získaš vždy novú inštanciu... Ak chceš naozaj nejakú navigáciu smerom späť, musíš si dané inštancie niekde ukladať (alebo údaje z nich) a potom obnoviť, ak existujú. Ak nie, vytvoriť novú inštanciu a tú použiť..
A tiež ako som uviedol v komentári, nezabudni odstrániť eventhandler a prípadne aj zavolať dispose na predchádzajúcom controle.
Samozrejme, nie je to jediné riešenie...
Treba si vybrať také, ktoré ti bude najviac vyhovovať..