从一个表单传递值到另一个表单

12
我有两个表单分别叫做form1form2
  • form1由一个label和一个button组成。
  • form2由一个textBox和一个button组成。

当我点击form1中的按钮时,会显示form2。任何在textBox中输入的内容,一旦我点击form2中的按钮,都应该写回到form1.label中。
以下是我的代码,但它不能正常工作。

// Code from Form 1
public partial class Form1 : Form
{
    public void PassValue(string strValue)
    {
        label1.Text = strValue;
    }
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.Show();
    }

}

// Code From Form 2

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 objForm1 = new Form1();
        objForm1.PassValue(textBox1.Text);
        this.Close();
    }
}

同时还有一张截图:

应用程序截图

我该如何实现这个?


1
你可以将Form1的实例传递到Form2的构造函数中,并将其存储为Form2的属性。 - Johann Blais
我已经准确地列出了那个解决方案。 - mao
9个回答

18

你无法访问创建 form2 的 form1。在 form2 的 button1_Click 中,你创建了 Form1 的新实例,这不同于初始实例。你可以通过以下方式将 form1 实例传递给 form2 构造函数:

   // Code from Form 1
 public partial class Form1 : Form
{
    public void PassValue(string strValue)
    {
        label1.Text = strValue;
    }
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2(this);
        objForm2.Show();
    }

}

// Code From Form 2

public partial class Form2 : Form
{
    Form1 ownerForm = null;

    public Form2(Form1 ownerForm)
    {
        InitializeComponent();
        this.ownerForm = ownerForm;
    }

    private void button1_Click(object sender, EventArgs e)
    {       
        this.ownerForm.PassValue(textBox1.Text);
        this.Close();
    }
}

今天早上我一直在尝试在C#中从一个表单返回数据到另一个表单,几乎尝试了数十个代码示例但都没有成功。有了你的这个示例,我现在能够实现我一直在寻找的功能,但我的面向对象编程概念不是很清楚,我正在努力理解构造函数。我是OOP的新手,正在学习C#,对于理解事物感到困难。:( - Almas Mahfooz

5

就像其他文章中提到的那样,如果创建Form1的新实例,您将无法引用原始的Form1。 您可以将Form1传递到Form2的构造函数中或将Form2的文本公开为公共属性,但我通常更喜欢使用委托来维护松散耦合。

// Code from Form 1
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.PassValue += new PassValueHandler(objForm2_PassValue);
        objForm2.Show();
    }
    public void objForm2_PassValue(string strValue)
    {
        label1.Text = strValue;
    }
}

// Code From Form 2
public delegate void PassValueHandler(string strValue);
public partial class Form2 : Form
{
    public event PassValueHandler PassValue;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (PassValue != null)
        {
            PassValue(textBox1.Text);
        }
        this.Close();
    }
}

委托更受青睐。好代码。运行良好。谢谢。 - Roshane Kekuluthotuwage

2

当你在进行以下操作时:

Form1 objForm1 = new Form1();
objForm1.PassValue(textBox1.Text);

如果你想创建一个新的 Form1 并在错误的 Form1 对象上调用 PassValue 方法,那么你需要进行修改。相反,你可以这样做:

public partial class Form1 : Form
{
    // This is the text that will be entered in form2
    public String form2text;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Show form2
        Form2 objForm2 = new Form2(this);
        objForm2.ShowDialog();
        // When form2 is closed, update the label text on form1
        label1.Text = form2text;
    }
}

public partial class Form2 : Form
{
    // This is the instance of Form1 that called form2
    private Form1 form1caller;

    public Form2(Form1 form1caller)
    {
        InitializeComponent();
        this.form1caller = form1caller;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Pass the textBox value to form1 before closing form2
        form1caller.form2text = textBox1.Text;
        this.Close();
    }
}

2
我刚刚尝试了这段代码,它可以运行,肯定会对你有所帮助。

在第一个表单(Form1)中输入以下内容:

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

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

在第二个表单(Form2)中使用以下代码:
public partial class Form2 : Form
{
    public Form2( string st)
    {
        InitializeComponent();
        textBox1.Text = st;
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }
}

1
你可以这样做:
class Form2
{
    public string ReturnedText = "";

    private void button1_Click(object sender, EventArgs e)
    {
        ReturnedText = textbox1.Text;
        Close();
    }
}

并且在form1中

Form2 objForm2 = new Form2();
objForm2.ShowDialog();
string ret = objForm2.ReturnedText;

0
你应该在这段代码中将form1的引用传递给form2,而不是创建一个新的实例。
private void button1_Click(object sender, EventArgs e)
{
    Form1 objForm1 = new Form1(); // ← this is another form1, not that you see
    objForm1.PassValue(textBox1.Text);
    this.Close();
}

0

这是你要做的事情:

// Code from Form 1
public partial class Form1 : Form
{
    public string MyValue { get; set; }

    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.textBox1.Text = MyValue;
        objForm2.MainForm = this;
        objForm2.Show();
    }
}

// Code From Form 2

public partial class Form2 : Form
{
    public Form1 MainForm { get; set; }
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MainForm.MyValue = textBox1.Text;
        MainForm.Show();
        this.Close();
    }
}

但是在Form2类中,objForm1的声明在哪里? - mao
公共窗体 MainForm - 使用基类 Form,其中 Form2 是从 Form 派生而来的。可以通过 Form 类使用。 - Abdul Munim
谢谢你的帮助,但我遇到了这个错误:“当前上下文中不存在'objForm1'名称”。 - marai
非常抱歉 - 我刚刚更新了代码,请查看 Form2 类。这应该可以工作。 - Abdul Munim

0
我通常处理这个需求的方式如下:
我在Form2类上放置一个公共属性:
public string ValueFromForm1 { get; set; }

//In the constructor, or other relevant method, I use the value
public Form2()
{
  form2LabelToDisplayForm1Value.Text = ValueFromForm1;
}

为了将某些东西返回给Form1,您需要向Form1类添加一个公共属性来接收该值,然后将对该表单的引用发送到Form2,以便Form2可以设置该值:
//Add reference property to Form2 class
public Form1 CallingForm { get; set; }

//Form2 can access the value on Form1 as follows:
private someMethod()
{
  this.CallingForm.ValueFromForm2 = "Info coming from form 2";
}

那么

//Add public property to Form1 class
public string ValueFromForm2 { get; set; }

//When Form2 is created, set the reference property
Form2 objForm2 = new Form2();
objForm2.CallingForm = this;
objForm2.Show();

由于Form2现在具有创建它的Form1的引用,因此无需在任何地方调用new Form1()。Form2所要做的就是设置引用上的值,然后关闭自己。


0

第一表单代码...:-

namespace Passing_values_from_one_form_to_other    
{

    public partial class Form1 : Form
    {
        string str;
        private String value1;//taking values from form no _of_test_cases

        public string value
        {
            get { return value1; }
            set { value1 = value; }
        }


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {


            textBox1.Text = str;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.ShowDialog();
            str = f2.passvalue;
        }
    }
}

表单2代码....:-

namespace Passing_values_from_one_form_to_other
{

 public partial class Form2 : Form

    {
         private string str;
        public string passvalue
        {
            get { return  str; }
            set { str = value; }
        }

        public Form2()
        {
            InitializeComponent();
        }

        private void Btn_Ok1_Click(object sender, EventArgs e)
        {

            passvalue = textBox1.Text;
            this.Close();

        }
    }
}

直接执行它,你就会清楚地了解它...同样的方法,你可以从一个表单传递值到另一个表单...

如果你遇到任何问题,请发表评论...

希望这能帮到你...

否则,你可以参考这个视频...

http://www.youtube.com/watch?v=PI3ad-TebP0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接