2011-02-18 50 views
1

我有一個windows應用程序,它有3種形式:Form1,2,3。我想從form2發送一個文本框的文本form1,然後從form1相同的文字form3,即從FORM2在Visual Studio中使用C#在3個窗口窗體之間傳遞數據

文本 - >FORM1 - >FORM3

  • 表1,具有2個按鈕,openform2,openform3。
  • 窗體2有一個文本框form2_textbox,&按鈕send_to_form1_button
  • Form3有一個文本框received_from_form1_textbox

現在,

  • 上點擊form1按鈕openform2Form2打開,
  • 字符串輸入到Form2的文本框form2_textbox,
  • 單擊這種形式的按鈕時form2_button,那麼我想Form1收到此字符串值&並將其存儲在一個字符串receivefromform2
  • ,然後顯示上的Form3form3_textbox此字符串值。
public partial class Form1 : Form 
{ 
    string receivefromForm2a; 

    public Form1() 
    { InitializeComponent(); } 

    public void Method_Receive_From_Form2(string receivefromForm2) 
    { 
     receivefromForm2a = receivefromForm2; 
     Form3 f3 = new Form3(receivefromForm2a); 
    } 

    private void openform3_Click(object sender, EventArgs e) 
     { 
      Form3 f3 = new Form3();**----this line gives error:No overload for method Form3 takes 0 arguments** 

      f3.Show(); 
     } 

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

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
     string loginname = form2_textbox.Text; 
    } 

    //SENDING VALUE OF TEXTBOX ON FORM2 TO FORM1. 

    private void send_to_form1_button_Click(object sender, EventArgs e) 
    { 
     Form1 f1 = new Form1(); 
     f1.Method_Receive_From_Form2(form2_textbox.Text); 
    } 
} 

public partial class Form3 : Form 
{ 
    public Form3(string receive_from_Form1) 
    { 
     InitializeComponent(); 
     received_from_form1_textbox.Text = receive_from_Form1; 
    } 
} 

出現此錯誤,因爲form2我有對象創建過程中給定的參數爲form1。 那我該怎麼辦?有沒有其他的方式來做到這一點,或者我該如何消除這個錯誤?

當我在方法中包含f3.Show() Method_Receive_From_Form2那麼就沒有錯誤。但這會使form3自動加載,而無需點擊任何按鈕。但我想通過點擊form1上的按鈕打開form3。然後將值顯示在文本框中。

回答

4

我會建議使用構造函數來使用性質的變化。這將使事情保持「包含」,這很簡單。

EX:

public partial class Form3 : Form 
{ 
    public String form1Text {get; set;} 

    public Form3() 
    { 
     InitializeComponent(); 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
     string loginname = form2_textbox.Text; 
    } 

    public String form2Text {get; set;} 

    private void send_to_form1_button_Click(object sender, EventArgs e) 
    { 

     form2Text = form2_textbox.Text; 
     this.DialogResult = DialogResult.Ok; 
     this.Close(); 
    } 
} 

然後在表格1:

public partial class Form1 : Form 
{ 
    string receivefromForm2a; 

    public Form1() 
    { InitializeComponent(); }  

    private void openform3_Click(object sender, EventArgs e) 
    { 
     Form3 f3 = new Form3(); 
     f3.form1Text = receivefromForm2a; 
     f3.Show(); 
    } 

private void OPENFORM2_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    if(f2.ShowDialog() == DialogResult.Ok) 
    { 
     receivefromForm2a = f2.form2Text; //New Property on Form2. 
    } 
} 
} 
1

創建form3 nonparametrized構造等在窗口2:

public Form3() { InitializeComponent(); }

這通常以在形式和/或代表抽象方法爲形式之間更新文本框和共享數據。或者創建一些數據持有者。

1

由於您使用string參數定義了一個,因此Form3不再具有默認構造函數,因此引發了該錯誤。您需要創建一個像這樣的默認構造函數public Form3(){}

但不是做所有這一切,你可以處理你們兩種形式的事件。就像如果Form1的形式主要是事遂所願可以做到這一點:

在Form1

public string textFromForm2 = string.Empty; 
private void openform3_Click(object sender, EventArgs e) 
{ 
    Form3 f3 = new Form3(); 
    f3.Controls["received_from_form1_textbox"].Text = textFromForm2 ; 
    f3.Show(); 
} 

private void OPENFORM2_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    //I am binding the event to a handler which will save text 
    //you should check for null for f2.Controls returned any thing or not, i am leaving it for now 
    f2.Controls["send_to_form1_button"].Click += (s,e)=>{ 
       txtFromForm2 = f2.Controls["form2_textbox"].Text; 
      }; 
    f2.Show(); 
} 

更新

,如果你不希望使用Lambadas然後綁定像這樣的活動:

首先,你需要到Form2的引用您的類,以便聲明是這樣的:

Form2 f2; 

隨後事件(代替倫巴達的我給前)

f2.Controls["send_to_form1_button"].Click += new Eventhandler(click_handler); 

在Form1類某處結合,則:

protected void click_handler(object sender, EventArgs e) 
{ 
    if(f2 != null) 
     txtFromForm2 = f2.Controls["form2_textbox"].Text; 
} 

類似地對於Form3。

+0

@Shekhar_Pro:親愛的先生,你能解釋一下我綁定的事件代碼,我不知道什麼發生在它?我將它複製到我的代碼中,但它給出的語法錯誤? – sqlchild 2011-02-18 14:36:49

+0

我已經使用Lambda和匿名代理綁定事件..如果您使用.net 2.0(它們不支持),那麼你可以做我通常在我的更新中解釋過的綁定 – 2011-02-19 03:13:34

+0

@Shekhar_Pro:先生,我的問題還沒有已經解決了,請告訴我在哪裏把你給出的代碼,完全混淆了,我無法實現從Form2發送Form1到Form1然後從Form1發送到form3的簡單過程,FORM1是主要的父代形成。 – sqlchild 2011-02-21 12:50:36

1

創建一個構造函數,該構造函數在Form3.cs中具有一個字符串類型的參數。

public Form3() 
{ 
    InitializeComponent(); 
} 
public Form3(string text):this() 
{ 
    this.txtName.text=text; 
} 
-1
public partial class Form1 : Form 
{ 
    string receivefromForm2a; 

    public Form1() 
    { InitializeComponent(); } 

    public void Method_Receive_From_Form2(string receivefromForm2) 
    { 
     receivefromForm2a = receivefromForm2; 
     Form3 f3 = new Form3(receivefromForm2a); 
    } 

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

    private void openform3_Click(object sender, EventArgs e) 
    { 
     Form3 f3 = new Form3(); //**----this line gives error:No overload for method Form3 takes 0 arguments** 
     f3.Show(); 
    } 
} 

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

    //SENDING VALUE OF TEXTBOX ON FORM2 TO FORM1. 

    private void send_to_form1_button_Click(object sender, EventArgs e) 
    { 
     Form1 f1 = new Form1(); 
    } 
} 

public partial class Form3 : Form 
{ 
    public Form3(string receive_from_Form1) 
    { 
     InitializeComponent(); 

     received_from_form1_textbox.Text = receive_from_Form1; 
    } 
} 
相關問題