2013-05-19 32 views
3

我在Form 1中有兩個按鈕,一個是「ShowForm2」按鈕,另一個是「button1」按鈕。如何使用公共獲取設置從表單2啓用表單1中的按鈕?

默認情況下,按鈕1被禁用。當我點擊「ShowForm2」按鈕時,表格2將顯示。

PrntScn of my form 1

所以,我想的是,當我點擊表格2 「按鈕2」,它將使形式 「Button1的」 1

enter image description here

所以,我嘗試在我的窗口2類代碼:

public partial class Form2 : Form 
{ 
    bool enable_form1_button1; 
    public bool Enable_form1_button1 
    { 
     get { return this.enable_form1_button1; } 
     set { this.enable_form1_button1 = value; } 
    } 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     enable_form1_button1 = true; 
    } 
} 
在我的Form1類

然後,我期待得到「enable_form1_button1 = true」將傳遞到FO RM 1並啓用我的表單1按鈕1。但如何做到這一點?

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

    private void btb_Showfrm2_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Show(); 
     button1.Enabled = frm2.Enable_form1_button1; // I put it here, and it just does not seems right 
    } 
} 
+0

你可以做像SetButton1Enabled'公共無效的方法(啓用布爾){button1.Enabled =啓用; }'Form1'內並在'Form2'的'button2_Click'方法內調用該方法('Form2'需要引用調用它的'Form1'對象)。或者與活動/代表合作。 – Corak

+1

它無法看到任何Form2 Form1公共方法,即使我已經設置修飾符爲form2中的button2 public2 – jhyap

+1

'Form1'和'Form2'是類,你不能調用(非靜態;但不要去在課堂上!)方法。你需要一個該類的「實例」。因此'frm2'-instance需要引用Form1類的調用實例,然後才能調用該方法。或者如果'button1'是公共的,直接設置'frm1.button1.enabled = true;'。 – Corak

回答

3

Form1.cs的

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
     button1.Enabled = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Form2 oFrm2 = new Form2(); 
     oFrm2.evtFrm += new ShowFrm(oFrm2_evtFrm); 
     oFrm2.Show(); 
    } 

    void oFrm2_evtFrm() 
    { 
     button1.Enabled = true; 
    } 
} 

Form2.cs

public delegate void ShowFrm(); 
    public partial class Form2 : Form 
    { 
    public event ShowFrm evtFrm; 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (evtFrm != null) 
     { 
      evtFrm(); 
     } 
    } 
} 
+0

這是要走的路。 Form1是老闆,它只是訂閱Form2中的_an_事件,Form2永遠不能控制Form1中發生的事情。 –

+0

即使公衆對我的設置聽起來更熟悉,但似乎使用委託應該是練習 – jhyap

+0

再次,做設置將是一個解決方法來做到這一點。因爲你將不得不交換兩個類的參考。而且它也不是Form2的類來啓用/禁用Form1的控件的工作。只有Form1應該負責播放其控件。 Form2只能告訴Form1這需要完成。 –

5

那麼你可以做的是,露出按鈕作爲財產和發送您的當前形式的參考,需要採取控制形式:

Form1中

public partial class Form1 : Form 
{   
    public Button BtnShowForm2 
    { 
     get { return btnShowForm2; } 
     set { btnShowForm2 = value; } 
    } 

    private void btnShowForm2_Click(object sender, EventArgs e) 
    { 
     // pass the current form to form2 
     Form2 form = new Form2(this); 
     form.Show(); 
    } 
} 

然後在Form2

public partial class Form2 : Form 
{ 
    private readonly Form1 _form1; 

    public Form2(Form1 form1) 
    { 
     _form1 = form1; 
     InitializeComponent(); 
    } 

    private void btnEnabler_Click(object sender, EventArgs e) 
    { 
     // access the exposed property here <-- in this case disable it 
     _form1.BtnShowForm2.Enabled = false; 
    } 
} 

我希望這是你要找的。

1

可以在例如from2構造發送您的Form1的一個refrence你的窗口2:在窗口2 ,然後在按鈕單擊事件處理程序調用form1的公開方法來啓用該按鈕:

這可能是您的Form 1代碼:

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

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

     public void enableButton() 
     { 
      button2.Enabled = true; 
     } 

,這可能是你的窗口2代碼:

public partial class Form2 : Form 
    { 
     private Form1 frm; 
     public Form2(Form1 frm) 
     { 
      InitializeComponent(); 

      this.frm = frm; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      frm.enableButton(); 
     } 
0

如果你只擁有一個實例你也可以在Program中有一個靜態的Button成員,它引用了你想從Form2啓用的按鈕。

Form1.cs中:

using System; 
using System.Windows.Forms; 

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

      button2.Enabled = false; 

      Program.button = button2; 
     } 

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

     private void button2_Click(object sender, EventArgs e) { } 
    } 
} 

Form2.cs:

using System; 
using System.Windows.Forms; 

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

     private void button1_Click(object sender, EventArgs e) 
     { Program.button.Enabled = true; } 
    } 
} 

的Program.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace StackOverflow_2013_05_19_Form1_Form2_buttons 
{ 
    static class Program 
    { 
     public static Button button; 

     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
} 
0

我會建議你使用事件/委託執行此任務。這是這樣做的標準方式。

再次在構造函數中傳遞引用或使靜態func/var/properties只是解決方法,並且被稱爲糟糕的編程。

+0

您能否提供一些關於如何使用委託在此示例上傳遞數據的示例代碼?以前,我確實嘗試過使用委託(指的是一些在線資源),但它似乎並不奏效。 – jhyap

+0

請參閱我向您提供的代碼回覆。 –

相關問題