2014-02-07 79 views
2

我查看了這裏和其他一些與此相關的網站,並找到了答案。然而,要麼解決方案不起作用,要麼我太瞭解了。我會解釋我的意思,當我說它「不會工作」。從Form2獲取Form1的複選框的值

有兩種方法,我試圖做到這一點。第一個使用getset,第二個,只需將控制修改器設置爲true。

使用其中任何一個時,似乎Form1的設計器中的值不會更新,因此Form2僅將該值讀取爲false,因爲默認情況下該值是複選框的值。

Form1

public bool CheckBox 
    { 
     get { return this.checkBox1.Checked; } 
     //set { this.checkBox1.Checked = value; } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm = new Form2(); 

     frm.ShowDialog(); 
    } 

Form2

private void button1_Click(object sender, EventArgs e) 
    { 
     Form1 frm = new Form1(); 

     if (frm.CheckBox == true) 
     { 
      //Do whatever 
     } 
    } 

這基本上是所有我想要做的事。如果我做錯了什麼,或者如果有更好的方法來做到這一點,請讓我知道。

謝謝。

+2

您需要的形式,而不是一個新的參考。 – DonBoitnott

+0

我還是C#的初學者,我沒有意識到這一點。謝謝大家幫助我。 – Raxdiam

回答

3

您在Form2中創建了一個新的Form實例。它與您當前的Form1實例完全不同。

相反,你可以將當前的Form1的實例傳遞給ShowDialog方法是這樣的:

frm.ShowDialog(this); 

通過這樣做,你的Form2Owner屬性設置爲您Form1 instance.Therefore您可以Owner屬性來訪問您的當前實例從Form2。您還應該將其轉換爲Form1以訪問CheckBox屬性。

private void button1_Click(object sender, EventArgs e) 
{ 

    if (((Form1)Owner).CheckBox == true) 
    { 
     //Do whatever 
    } 
} 
0

我是猜測這裏的問題是你如何使用實例變量。說我有兩種形式 - Form 1和Form和他們的定義如下:後來

Form1 a = new Form1(); 
Form2 b = new Form2(); 

現在,在用戶點擊表格2按鈕應用程序的生命週期中,你有什麼是(僞) :

// ... somewhere in "Form2" ... 
private void button1_Click(object sender, EventArgs e) { 
    Form1 c = new Form1(); 
    c.Checkbox = true; 
} 

問題是「c」與「a」Form1不同 - 它們是同一個表單的兩個不同實例。解決這個問題最簡單的方法就是讓你的複選框靜:

// in Form1... 
public static bool CheckBox { get; set; } 

現在你只有一個複選框值,它是所有的「副本」 Form1的(情況)相同。

注意

這工作,它並不完美。如果你想要Form1的兩個副本,並且你不想每個人都擁有自己的「CheckBox」值,這不適合你。相反,你需要做的是開始傳遞實例。所以,我在回答的開頭列出的代碼需要改變到是這樣的:

Form1 a = new Form1(); 
Form2 b = new Form2(a); 

其中「窗體2」目前的定義是:

public class Form2 : System.Windows.Forms.Form { 
    private Form1 copyOfForm1; 

    public Form2(Form1 theInstance) { 
    InitializeComponent(); 
    copyOfForm1 = theInstance; 
    } 
} 

現在,任何你想要訪問一個實例來自FormB內部的Form1,你可以通過使用「copyOfForm1」變量來完成。這是一切有關實例/靜態的說法,但希望它至少能讓你走上正確的軌道。祝你好運!

0

在Form2上,使您的複選框值爲屬性。當您關閉窗體時,您可以將DialogResult設置爲OK。因此,對窗口2的接近事件或任何你想要真正做到:

this.DialogResult = DialogResult.OK; 

然後使用以下方法來創建,顯示和檢索複選框值(在關閉時也將部署窗口2中)。當DialogResult正常時,您可以從屬性中獲取值。

using (var form2 = new Form2()) 
{ 
    if (form2.ShowDialog() == DialogResult.OK) 
    { 
     var checkboxValue = form2.Checkbox; 
    } 
} 

如果你不想關閉表單,您可以設置另一個布爾屬性爲true,每當你想要得到的複選框的值檢查屬性。因此,在窗口2:

public bool CheckboxSelected { get; set; } 
public bool Checkbox { get; set; } 
event for Checkbox change: 
    Checkbox = value of checkbox; 
    CheckboxSelected = true; 

然後在Form1上,你可以觀看CheckboxSelected ==真:

using (var form2 = new Form2()) 
{ 
    if (form2.CheckboxSelected == true) 
    { 
     var checkboxValue = form2.Checkbox; 
    } 
}