2013-07-02 125 views
3

我有兩種窗體,子窗體通過buttonClick在Form1中調用/創建。現在我可以啓動subForm,隱藏Form1,然後在subForm關閉時取消隱藏Form1。我希望能夠做的是:隱藏主窗體,開始新窗體,在兩個窗體之間切換而不關閉第二個窗體

  1. 如果用戶點擊changeform按鈕,查看是否子窗體活躍,但隱藏
  2. 如果沒有,則啓動子窗體,否則隱藏Form1上,取消隱藏子窗體和控制傳遞給它
  3. 如果用戶點擊窗體的changeform按鈕,隱藏窗體,取消隱藏Form1並控制傳遞給它
  4. 如果用戶點擊窗體的右上角的「X」,然後關閉應用程序,無論哪種形式是積極的。 (現在,選擇「X」關閉子窗體並打開/取消隱藏Form1。)

我可以找到解決方案來完成部分要求(也許是所有的,我只是太小白知道)。在這裏,從我剛纔的問題重複一遍,我到目前爲止的代碼是:

Form1中

private void countClick(object sender, EventArgs e) 
    { 
     this.Hide(); 
     subForm myNewForm = new subForm(); 
     myNewForm.ShowDialog(); 
     this.Show(); 
     countSelect.Checked = false; 
    } 

和子窗體

private void totalClick(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

這工作,但它不是真正的優雅。

+0

的可能重複[隱藏表單,切換到第二形式,緊隨其後的形式和取消隱藏第一種形式(HTTP://計算器。 COM /問題/ 17287361 /藏身一個外形交換機到一個秒外形緊密第二-FO rm-and-unhide-first-form) – musefan

+0

@musefan這是我原來的問題,這是由這裏顯示的代碼片段回答的。 –

回答

2

我認爲最好的辦法是自己推出ApplicationContext。這使您可以完全控制應用程序的生命週期,而不必將其綁定到特定的窗口。有關更多信息,請參見http://msdn.microsoft.com/en-us/library/ms157901.aspx

下面是一個例子:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MyApplicationContext()); 
    } 
} 

public class MyApplicationContext : ApplicationContext 
{ 
    public MyApplicationContext() 
    { 
     ShowForm1(); 
    } 

    public void ShowForm1() 
    { 
     if (_form2 != null) 
      _form2.Hide(); 
     if (_form1 == null) 
     { 
      _form1 = new Form1(this); 
      _form1.FormClosed += OnFormClosed; 
     } 
     _form1.Show(); 
     MainForm = _form1; 
    } 

    public void ShowForm2() 
    { 
     if (_form1 != null) 
      _form1.Hide(); 
     if (_form2 == null) 
     { 
      _form2 = new Form2(this); 
      _form2.FormClosed += OnFormClosed; 
     } 
     _form2.Show(); 
     MainForm = _form2; 
    } 

    private void OnFormClosed(object sender, FormClosedEventArgs e) 
    { 
     if (_form1 != null) 
     { 
      _form1.Dispose(); 
      _form1 = null; 
     } 
     if (_form2 != null) 
     { 
      _form2.Dispose(); 
      _form2 = null; 
     } 
     ExitThread(); 
    } 

    private Form1 _form1; 
    private Form2 _form2; 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public Form1(MyApplicationContext context) 
     : this() 
    { 
     _context = context; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (_context != null) 
      _context.ShowForm2(); 
    } 

    private readonly MyApplicationContext _context; 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public Form2(MyApplicationContext context) 
     : this() 
    { 
     _context = context; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (_context != null) 
      _context.ShowForm1(); 
    } 

    private readonly MyApplicationContext _context; 
} 
0

爲什麼不能簡單地將它們設置爲前景,最上面的,等等? 並將它們反向設置?

---添加評論提議

+0

他*不*將父表格的引用傳遞給子表單,那麼爲什麼你告訴他不要這樣做? – Servy

+0

this.MainFormRef_Field = MainFormRef; 這是什麼? – icbytes

+0

這是其他用戶的答案,而不是OP。如果您想回應,也許您應該對該答案發表評論。 – Servy

-1

subForm訪問MainForm

subForm創建一個構造函數和一個字段:

MainForm MainFormRef_Field; 
subForm(MainForm MainFormRef) 
{ 
    this.MainFormRef_Field = MainFormRef; 
} 

現在,您可以訪問MainForm使用此參考。就像這樣:

MainFormRef_Field.Show(); 
MainFormRef_Field.Hide(); //or how ever you want to handle it 

MainForm訪問subForm

處理您subForm使用您爲它創建的對象。在這裏:

subForm myNewForm = new subForm(); 

要關閉整個應用程序,如果任何形式的關閉:

設置一個Form_Closing事件兩種形式:

private void MainForm_Closing(object sender, EventArgs e) 
{ 
    Application.Exit(); 
} 

private void subForm_Closing(object sender, EventArgs e) 
{ 
    Application.Exit(); 
} 

注:

我我沒有寫出所有案例的整個代碼。設置變量,檢查條件。這完全取決於你如何編碼。所有你需要的要點我已經爲你提供瞭解決方案。

+0

我可以解釋'-1'嗎? – Shaharyar

+0

我沒有這樣做。不知道爲什麼它在那裏。 –

+0

是不是我。但我把我的答案的一部分,在這裏(因爲它是指比業務方案的問題,更多的你的回答: 從子窗體訪問父形式是不良作風和交叉引用 更好的方法是讓子窗體彈出並響應對話結果等 或者對父窗體上的其他事件做出反應 但是不會將父項引用傳遞給子窗體 – icbytes

2

所以我們開始了前往子窗體並創建可用於當它要改變的形式通知家長一個新的事件:

public event Action ChangeForm; 

然後,我們觸發事件和隱藏

private void ChangeForm_Click(object sender, EventArgs e) 
{ 
    Hide(); 
    if (ChangeForm != null) 
     ChangeForm(); 
} 

母體形式需要孩子形式的實例字段的一個實例:

私人窗體孩子=新子(當它要改變形式的子窗體);

,它需要初始化它在它的構造函數,既增加處理器的ChangeForm事件顯示父,併到關閉事件來關閉自己:

public Form1() 
{ 
    InitializeComponent(); 

    child.ChangeForm +=() => Show(); 
    child.FormClosed += (s, args) => Close(); 
} 

然後,所有剩下的就是父形式可以隱藏自身,並顯示孩子時,要改變形式:

private void ChangeForm_Click(object sender, EventArgs e) 
{ 
    Hide(); 
    child.Show(); 
} 
+0

感謝您的快速響應。所有誰回答。這是我採取的路線,所有工作正常。再次感謝。 –

+1

'form2.Closed + =(s,args)=> this.Close();'我可以知道這個聲明如何工作?確切地說'(s,args)'是什麼?使用lambda運算符(=>)? –

+0

@YashSaraiya聲音就像你已經知道這是一個lambda,所以你可以簡單地搜索你想知道它的任何內容。 – Servy

相關問題