2011-09-01 29 views
4

我正在MS Visual C#中編寫一個WindowsForms應用程序,並且我需要兩個窗體才能夠互相引用。在我測試時,我在Form1上創建了兩個按鈕 - 一個顯示Form2的按鈕和另一個隱藏它的按鈕(代碼如下)。C# - 如何使兩個表單互相引用

我想爲Form2做同樣的事情 - 創建兩個隱藏或顯示Form1的按鈕。我使用了與Form1相同的方法,但是當我編譯應用程序時,它似乎陷入了無限循環,並且出現了StackOverflow消息。

我該如何更改代碼,以便兩種表單都能夠互相引用?

Form 1代碼:

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    Form2 frm2; 
    public Form1() 
    { 
     InitializeComponent(); 
     frm2 = new Form2(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm2.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm2.Visible = true; 
    } 
} 
} 

Form2的代碼:

namespace WindowsFormsApplication1 
{ 
public partial class Form2 : Form 
{ 
    Form1 frm1; 
    public Form2() 
    { 
     InitializeComponent(); 
     frm1 = new Form1(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = true; 
    } 
} 
} 
+2

您應該爲您的控件。 – SLaks

+0

Form1和Form2構造函數在無限循環中互相調用。 – Odrade

回答

5

Forms2的代碼應該是

namespace WindowsFormsApplication1 
{ 
public partial class Form2 : Form 
{ 
    Form1 frm1; 
    public Form2(Form1 parent) 
    { 
     InitializeComponent(); 
     frm1 = parent; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = true; 
    } 
} 
} 

即使雙方互相交談,必須先創建並傳遞給第二個。

Form1中需要被tweeked到

public Form1() 
{ 
    InitializeComponent(); 
    frm2 = new Form2(this); 
} 

的另一種方式來做到這一點是同時創建和建設

namespace WindowsFormsApplication1 
{ 
public class SomewhereElse 
{ 
    public void SomeFunction() 
    { 
     Form1 form1= new Form1(); 
     Form2 form2= new Form2(); 

     form1.frm2 = form2; 
     form2.frm1 = form1; 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form1 frm1 {get; set;} 
    public Form2(Form1 parent) 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = true; 
    } 
} 

public partial class Form1 : Form 
{ 
    public Form2 frm2 {get; set;} 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm2.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm2.Visible = true; 
    } 
} 
} 
+0

感謝您的詳細回覆。我決定選擇第一個選項。 – andrewl85

0

爲您塑造其他形式的你正在創建每個窗體的新實例。

相反,您應該讓其中一個表單將其父窗體的實例作爲參數。

0

後通過它當您創建的Form2上的一個實例frm1對象,這個新實例創建另一個Form1實例,創建一個新的Form 2實例,該實例...

你看到無限循環嗎?

在主類或全局應用程序變量上創建彼此的一個實例。或者將它們作爲參數傳遞給對方。 .NET框架將僅引用它們而不分配新的內存空間。

1

需要將「其他形式」提供給適當的實例。像這樣的東西應該有所幫助。

public partial class TogglingForm : Form 
{ 
    TogglingForm Other {get; set;} 
    public TogglingForm() 
    { 
     InitializeComponent(); 
    }   

    private void HideOther_Click(object sender, EventArgs e) 
    { 
     Other.Visible = false; 
    } 

    private void ShowOther_Click(object sender, EventArgs e) 
    { 
     Other.Visible = true; 
    } 
} 

.... 


static void Main() 
{ 
    var first = new TogglingForm(); 
    var second = new TogglingForm {Other = first}; 
    first.Other = second; 

    first.Show(); 
} 
0
namespace WindowsFormsApplication1 
{ 
public partial class Form2 : Form 
{ 
    Form1 frm1; 
    public Form2(Form1 frm1) 
    { 
     InitializeComponent(); 
     this.frm1 = frm1; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     frm1.Visible = true; 
    } 
} 
}