2011-06-07 63 views
0

我之前學會了如何在兩個表單之間來回移動。但如果有更多的表單呢? 這是我爲Form1代碼:c#導航或跳過表單

Form2 form2 = new Form2(); 
    private void aboutoldtrafford_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.Hide(); 
     form2.ShowDialog(); 
     this.Show(); 
    } 

我可以去窗口2並有兩粒扣有:背部和未來

 private void backbutton_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.DialogResult = DialogResult.OK; 
    } 

    Form3 form3 = new Form3(); 
    private void nextbutton_MouseClick(object sender, MouseEventArgs e) 
    { 
      this.Hide(); 
      form3.ShowDialog(); 
      this.Show(); 

    } 

後退按鈕將返回到Form1和下一會去form3 。下面是我的form3代碼。 在form3,有兩個按鈕:回來講完

private void back_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.DialogResult = DialogResult.OK; 
    } 

    private void finish_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.Hide(); 
     // i want to go back to form1 

    } 

後退按鈕將返回到窗口2並完成按鈕將返回到Form1。顯然,我不能做「this.DialogResult = DialogResult.OK;」在結束按鈕中。 我怎樣才能回form1而不去form2?請幫助...

+0

你不是在這裏問過類似的問題嗎? http://stackoverflow.com/questions/6260221/go-back-to-the-previous-form-c – 2011-06-07 08:52:10

+0

哈哈,是的,但我得到的答案是隻有兩種形式之間..我有一個問題與這麼多形式工作 – 2011-06-10 07:52:14

回答

1

第一個選項 - 您可以使用UserControls而不是Forms,只需在要激活的控件上調用BringToFront()。

另一個選項 - 將應用程序狀態管理移動到某個對象。創建狀態圖

public class StateManager 
{ 
    private Dictionary<ApplicationState, Form> _stateMap = new Dictionary<ApplicationState, Form>(); 
    private ApplicationState _currentState; 

    public void RegisterState(ApplicationState state, Form form) 
    { 
     if (_stateMap.ContainsKey(state)) 
      // throw an exception, or rewrite mapping 

     _stateMap.Add(state, form); 
    } 

    public ApplicationState CurrentState 
    { 
     get { return _currentState; } 
     set 
     { 
      if (!_stateMap.ContainsKey(value)) 
       // do nothing or throw exception 

      if (_currentState == value) 
       return;     

      CurrentForm.Hide();     
      _currentState = value; 
      CurrentForm.Show(); 
     } 
    } 

    public Form CurrentForm 
    { 
     get { return _stateMap[_currentState]; } 
    } 
} 

我在這裏使用表單實例,但您可以通過工廠創建實例。

下一步 - 註冊(當然,你應該給應用程序的狀態更有意義的名稱)應用程序的狀態:

StateManager stateManager = StateManager.Instance; 
stateManager.RegisterState(ApplicationState.Form1, new Form1()); 
stateManager.RegisterState(ApplicationState.Form2, new Form2()); 
stateManager.RegisterState(ApplicationState.Form3, new Form3()); 

設置當前狀態和運行應用程序:

stateManager.CurrentState = ApplicationState.Form1; 
Application.Run(stateManager.CurrentForm); 

而最後一步 - 更改應用程序狀態。你可以通過stateManager實例的形式構造,或使用靜態辛格爾頓:

private void previousButton_Click(object sender, EventArgs e) 
{ 
    StateManager.Instance.CurrentState = ApplicationState.Form1; 
} 

而且您可以創建動態的形式,對國家的定義等

運氣好使用配置文件!

+0

你能舉個例子嗎?你發佈的第一個代碼,你把它放在哪裏?在主要形式? – 2011-06-07 11:24:19

+0

第一個代碼是與自己的文件分開的類。註冊和設置當前狀態轉到Program.cs文件中的Main()函數。同樣對於這個例子,你將需要StateManager實現的Singleton模式(http://msdn.microsoft.com/en-us/library/ff650316.aspx) – 2011-06-07 11:32:31

+0

aw ...這對我來說太多了,我剛開始學習c#...這將需要很長的時間,我學習這個..感謝信息 – 2011-06-07 11:49:16