2011-05-07 99 views
-1

之間我們可以訪問窗體2Form1中通過這種方式:跳躍形式

在Form1:

private buttonForm1_click(object sender,EventArgs e) 
{ 
Form2 frm2 = new Form2() 
frm2.show() 
this.hide() 
} 

並在窗體2,我們希望訪問Form1中它已隱藏。

在窗體2:

private buttonForm2_click(object sender,EventArgs e) 
{ 
//What Can I DO ? 
//I Don't Want to Create Another Instance From Form1 

} 
+0

可能重複的[訪問窗體之間的公共方法](http://stackoverflow.com/questions/4176682/access-of-public-method-between-forms) – 2011-05-07 17:45:14

+0

在問一個問題之前,這是一個好主意先搜索它。這個確切的問題幾乎每天都在這裏提出,左邊的邊欄包含了很多這樣的問題。 – 2011-05-07 18:24:45

+0

-1因爲相關問題包含幾個很好的匹配。 – 2011-05-07 18:25:52

回答

1

您可以傳遞一個Form1對象Form2構造:

public partial class Form1 
{ 
    // ... 

    private buttonForm1_click(object sender,EventArgs e) 
    { 
     Form2 frm2 = new Form2(this) 
     frm2.show() 
     this.hide() 
    } 

    // ... 
} 

public partial class Form2 
{ 
    private Form1 _form1; 

    public Form2(Form1 form1) 
    { 
     InitializeComponents(); 

     _form1 = form1; 
    } 

    // ... 

    private buttonForm2_click(object sender,EventArgs e) 
    { 
     _form1.Show(); 
    } 
} 
+1

如果你這樣做,確保你也有一個無參數的構造函數,否則Visual Studio將無法在設計視圖中打開'Form2'。 – adrianbanks 2011-05-07 17:37:07

+1

我會建議,而不是通過參數傳遞,而不是通過使用frm2變量來填充Form2中的變量。例如,frm2。CalingForm = this;這樣,您仍然可以調用Form2而不需要參數,但是如果需要,您可以選擇傳遞表單參考。 – IAmTimCorey 2011-05-07 17:39:17

+0

@BiggsTRC這取決於'_form1'是什麼。在某些情況下,空字段可能會破壞類的完整性,您應該通過它來拋出構造函數。 – oxilumin 2011-05-07 17:41:19

1

如果你想兩種形式訪問對方,他們需要了解對方莫名其妙。做到這一點的一種方式是父母/子女關係。但是,這可能不是你想要做的。另一種選擇是爲每個表單創建引用,以便兩者都可以訪問它們。

第三種方法是在Form2打開Form2時,將對Form1的引用傳遞給Form2。在Form2中創建一個Form1變量並在從Form1中打開Form2時填充它。當你希望兩個表單能夠訪問對方時,這將起作用,但不能很好地擴展。

0

最簡單的答案是,在Form2的構造函數傳遞到Form1的參考。

這樣,在Form2中,您可以使用並訪問其控件或調用其中的方法。

1

在Form1:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

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

     private void button1_Click(object sender, EventArgs e) 
     { 
      var f = new Form2(this); 
      f.Show(); 
     } 
    } 
} 

在窗體2:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

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

     Form1 _f1 = null; 
     public Form2(Form1 f) : this() 
     { 
      _f1 = f; 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      _f1.Text = "Nice!"; 
     } 
    } 
} 
0

如果不創建的窗體的多個副本,我覺得這是最容易使用的方法。讓表單本身爲它創建句柄:

public partial class Form1 
{ 
    public static Form1 Current; 

    public Form1() 
    { 
     InitializeComponents(); 
     Current = this; 
    } 
} 

public partial class Form2 
{ 
    public static Form2 Current; 

    public Form2() 
    { 
     InitializeComponents(); 
     Current = this; 
    } 

    private buttonForm2_click(object sender,EventArgs e) 
    { 
     Form1.Current.Show(); 
    } 
} 

如果人們關閉表單,它會變得更復雜一點。所以在交割處理做(如果你想保持一個手柄):

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
    Visible = false; 
    WindowState = FormWindowState.Minimized; 
} 

e.Cancel將保持形式從實際被破壞,需要你重新創建它。儘管如果你想要它被銷燬,你總是可以通過將Current變量轉換爲一個Current屬性來創建一個新的屬性get;