2011-02-18 134 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; 
    } 
} 
相关问题