2012-10-20 72 views
0

基本上; Form1有2個按鈕,Form2有1個按鈕。 當您單擊Form 2的按鈕時,它將檢查您單擊的Form 1上的哪個按鈕,根據您單擊的按鈕(在Form 1上)打開Form 3或Form 4。在表單之間傳遞值;精煉


所以我利用了Mark Halls第一種在表單之間傳遞變量的方法。現在我的封閉式改進的後半部分。

Form1中

private void btnLogin_Click(object sender, EventArgs e) 
     { 
      // Call function while storing variable info. 
      Account("login"); 
     } 

     private void btnRegister_Click(object sender, EventArgs e) 
     { 
      // Call function while storing variable info. 
      Account("register"); 
     } 

     // Function used to pass Variable info to Account form while opening it as instance. 
     private void Account(string formtype) 
     { 
      // Generate/Name new instant of form. 
      frontend_account frmAcc = new frontend_account(); 
      // Pass variable to instance. 
      frmAcc.CheckButtonClick = formtype; 
      // Show form instance. 
      frmAcc.Show(this); 
      // Hide this instance. 
      this.Hide(); 
     } 

窗體2

// String Variable to store value from Login. 
     public string CheckButtonClick { get; set; } 

     private void btnContinue_Click(object sender, EventArgs e) 
     { 
      // If statement to open either Main form or Registration form, based on Login variable. 
      if (CheckButtonClick == "login") 
      { 
       // Generate/Name new instant of form. 
       frontend_main frmMain = new frontend_main(); 
       // Show form instant. 
       frmMain.Show(); 
       // Close this instant. 
       this.Close(); 
      } 
      else if (CheckButtonClick == "register") 
      { 
       // Generate/Name new instant of form. 
       frontend_register frmReg = new frontend_register(); 
       // Show form instant. 
       frmReg.Show(); 
       // Close this instant. 
       this.Close(); 
      } 
     } 

Form 2上有TWO單選按鈕,我可以ADEPT該代碼被打開的形式何時設置一個選項卡控制的焦點?即。如果選中了radClient,請在打開winform後將焦點設置爲tabcontrol,否則,如果選中了radStudent,請在打開winform後將焦點設置在tabcontrol(其他頁面)上......並且如果沒有選中廣播,我想不打開一個winform。

我相信這會成爲焦點;

// Sets focus to first tab. 
tabRegister.SelectedTab = tabRegister.TabPages[0]; 
// Sets focus to second tab. 
tabRegister.SelectedTab = tabRegister.TabPages[1]; 
+0

看看這個帖子的方式來傳遞形式之間的消息如出一轍:http://stackoverflow.com/questions/12976205/best-way-to-handle-passing- of-control-checked-state-between-forms/12977226#12977226 –

回答

0

在您的例子中,我看到的是你正在關閉該關閉你的Form1中和你的窗體2的處置你的父窗體的第一個問題,我會做的是隱藏的,而不是關閉它Form1中,我會再創造Form2上的公共屬性傳入所選按鈕。但是,無論何時你打開和關閉多個表單都會變得麻煩,我要做的就是爲你的其他表單創建UserControl並在面板中交換它們。第一個例子是如何按照你的要求去做。

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

    private void btnLogin_Click(object sender, EventArgs e) 
    { 
     ShowForm2("login"); 
    } 

    private void btnRegister_Click(object sender, EventArgs e) 
    { 
     ShowForm2("register"); 
    } 


    private void ShowForm2(string formtype) 
    { 
     Form2 f2 = new Form2(); // Instantiate a Form2 object. 
     f2.CheckButtonClick = formtype; 
     f2.Show(this); // Show Form2 and 
     this.Hide(); // closes the Form1 instance. 

    } 
} 

窗體2

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

    public string CheckButtonClick { get; set; } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (CheckButtonClick == "login") 
     { 
      Form3 f3 = new Form3(); // Instantiate a Form3 object. 
      f3.Show(); // Show Form3 and 
      this.Close(); // closes the Form2 instance. 
     } 
     else if (CheckButtonClick == "register") 
     { 
      Form4 f4 = new Form4(); // Instantiate a Form4 object. 
      f4.Show(); // Show Form4 and 
      this.Close(); // closes the Form2 instance. 
     } 

    } 
} 

Form3和Form4備註由於Form1中早已忘記了這些形式我尋找它打開備份

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

    private void Form3_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     FormCollection frms = Application.OpenForms; 
     foreach (Form f in frms) 
     { 
      if (f.Name == "Form1") 
      { 
       f.Show(); 
       break; 
      } 
     } 
    } 
} 

用戶控件的第二個選項具有一個帶有面板的窗體。它使用的事件信號的格式轉換控制加上公共財產上UserControl2

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

    private void userControl1_LoginOrRegisterEvent(object sender, LoginOrRegisterArgs e) 
    { 
     logonType = e.Value; 
     userControl2.BringToFront(); 
    } 


    private void userControl2_ControlFinshedEvent(object sender, EventArgs e) 
    { 
     if (logonType == "logon") 
      userControl3.BringToFront(); 
     else if (logonType == "register") 
      userControl4.BringToFront(); 
    } 

    private void userControl3_ControlFinshedEvent(object sender, EventArgs e) 
    { 
     userControl1.BringToFront(); 
    } 

    private void userControl4_ControlFinshedEvent(object sender, EventArgs e) 
    { 
     userControl1.BringToFront(); 
    } 
} 

的UserControl1

public partial class UserControl1 : UserControl 
{ 
    public delegate void LoginOrRegisterHandler(object sender, LoginOrRegisterArgs e); 
    public event LoginOrRegisterHandler LoginOrRegisterEvent; 

    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     LoginOrRegisterArgs ea = new LoginOrRegisterArgs("logon"); 
     LoginOrRegisterEvent(sender, ea); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     LoginOrRegisterArgs ea = new LoginOrRegisterArgs("register"); 
     LoginOrRegisterEvent(sender, ea); 
    } 
} 

public class LoginOrRegisterArgs 
{ 
    public LoginOrRegisterArgs(string s) {Value = s;} 
    public string Value {get; private set;} 
} 

UserControl2

public partial class UserControl2 : UserControl 
{ 
    public delegate void ControlFinishedHandler(object sender, EventArgs e); 
    public event ControlFinishedHandler ControlFinshedEvent; 
    public UserControl2() 
    { 
     InitializeComponent(); 
    } 
    public string SetLogonType { get; set; } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ControlFinshedEvent(sender, new EventArgs()); 
    } 
} 

UserControl3 & UserControl4,除了不同的類名

public partial class UserControl3 : UserControl 
{ 
    public delegate void ControlFinishedHandler(object sender, EventArgs e); 
    public event ControlFinishedHandler ControlFinshedEvent; 
    public UserControl3() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ControlFinshedEvent(sender, new EventArgs()); 
    } 
} 
+0

謝謝馬克。這我已經使用你的第一個解決方案,它的工作原理是完美的,你可以在謝謝= D中享受親愛的河流和幾十個處女 –

0

正如我在我的評論中所建議的,我知道在表單之間傳遞數據的最好方法之一就是使用事件。

基本上,在「孩子」形式中,您聲明瞭將通過「主」形式來處理或收聽的事件。

請參閱我評論中的參考答案,如果您有關於如何調整它的具體問題,請提問。

乾杯