将字符串传递给另一个表单时出错

时间:2013-12-28 19:36:20

标签: c# winforms

// Form1
// I have a text box and I want the value to pass onto a text box on form 2
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
}



// Form2
private Form1 otherForm;
private void Form2_Load(object sender, EventArgs e)
{
    string test = textBox1.Text;
    otherForm.textBox1.Text = test;
}

当我尝试将值传递到表单2上的textBox时,它会显示“调用目标已抛出异常。”

我已经将保护更改为公开,但是我没有成功传递字符串。

5 个答案:

答案 0 :(得分:2)

实现此目的的最简单方法是将信息传递给第二种形式的构造函数。这样您就不需要公开文本框了。

Form2

// Constructor
public Form2 (string message)
{
    InitializeComponent();    // Call this first, as it creates the forms controls
    textBox1.Text = message;
}

Form1

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

顺便说一句,您将字符串从Form2传递给Form1(与需要的方式相反),您永远不会初始化变量otherForm。它始终具有默认值null

答案 1 :(得分:1)

据我所知,您希望将textbox的值从form1传递给form2。

在Form2中添加以下代码。

    private Form1 otherForm;
    public Form2(Form1 formObj)
    {
     InitializeComponents();
     otherForm = formobj;
    }

    private void Form2_Load(object sender, EventArgs e)
    {            
        this.textbox1.Text = otherForm.textbox1.Text;
    }

在form1按钮事件中添加以下代码

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

答案 2 :(得分:1)

当您打开Form2时,您将文本框的值传递给Form2的构造函数。
Form2的构造函数中,将传递的值存储在全局级别类变量中,并在Form2_Load事件中使用它。
您也可以直接在Form2的构造函数中设置Form2的textbox1但是在调用InitializeComponent之后

// In Form1
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2(textbox1.Text);
    form2.Show();
}


// in Form2
public class Form2:Form
{
    private string textFromOtherForm;

    public void Form2(string fromForm1)
    {
         InitializeComponent();
         textFormOtherForm = fromForm1;
    }    
    private void Form2_Load(object sender, EventArgs e)
    {
        this.textBox1.Text = textFromOtherForm;
    }
}

答案 3 :(得分:0)

由于textboxt1在form2中不存在,因此无法访问。

你可以像selman所说的那样公开文本框并引用form1。

但更好的方法是在构造函数

上使用字符串
public Form2 (string theContent){
//your init here
}

答案 4 :(得分:0)

我会谨慎地开发这种方式,因为它会导致显示元素(表单)之间的耦合代码。这通常用控制器对象处理(查找MVC(WEB)/ MVVM(WPF))。这里说的有两种方法可以做到。

选项1 - 添加属性

    public string Form1Text1Text { get; set; }

    public Form2()
    {
        InitializeComponent();
    }


   private void button1_Click(object sender, EventArgs e)
    {
        var f2 = new Form2();
        f2.Form1Text1Text = textBox1.Text;
        f2.ShowDialog();
    }

选项2 - 调用方法

 private string _mytext;
    public void SetText(string text)
    {
        _mytext = text;
    }



    private void button1_Click(object sender, EventArgs e)
    {
        var f2 = new Form2();
        f2.SetText(textBox1.Text);
        f2.ShowDialog();
    }