使用属性在表单之间传递字符串不起作用

时间:2014-06-08 16:08:26

标签: c# string winforms forms properties

我知道这里有很多帖子解释了如何使用Property方法在表单之间传递字符串,但我无法使其工作。我有Form1和Form2,在Form1中,我打开一个Bitmap,我想将路径传递给Form2,所以我可以稍后访问这个Bitmap。如果我在Form1中更改属性值,它没问题,但是当我加载Form2并尝试访问此信息时,它为null。我不知道自己做错了什么,如果有人可以看一看并发现我的错误,我真的会感到沮丧。

这是我的代码

Form1中

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

    String teste;
    public String filePath // this is my property
    {

        get
        {
            return teste;
        }
        set
        {
            teste = value;
        }
    } 

private void OpenMap_Click(object sender, EventArgs e) // opens the bitmap
    {
     try
        {
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {
                Bitmap bit = new Bitmap(open.FileName);
                pictureBox2.Image = bit;
                pictureBox2.BorderStyle = BorderStyle.Fixed3D;
                pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
                this.filePath = open.FileName;  // update my property
            }
        }
        catch (Exception)
        { throw new ApplicationException("Falied loading image"); }
    }

private void Next1_Click(object sender, EventArgs e) // opens form2
    {
        Form2 inicio = new Form2();
        inicio.Show();
        this.Hide();
    }

 private void SSc1_1_Load(object sender, EventArgs e)
    {

    }

}

}


表格2

public partial class Form2 : Form
{

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
       Form1 obj = new Form1();
       MessageBox.Show(obj.filePath);
    }
}

问题是MessageBox始终为null ..

提前致谢 欢呼声

2 个答案:

答案 0 :(得分:0)

为什么要创建Form1的第二个实例?您需要引用现有的Form1而不是新的Form1。通过Application.OpenForms(或类似的东西)获取现有表单,或者全局存储对表单对象的引用。您正在访问的Form1从未向用户显示,因此只有设计时间值。

答案 1 :(得分:0)

如果要使用属性发送信息,表单2需要引用表单1的实例才能访问它。

现在,您正在从表单2创建表单1的新实例,但由于该实例与您在参数中存储值的实例不同,因此该表单的参数没有该值。

您可以将表单1的引用传递给表单2的构造函数:

Form2 inicio = new Form2(this);

在构造函数中,您将存储该引用以供稍后使用:'

private Form1 _form1;

public Form2(Form1 form1)
{
    _form1 = form1;
    InitializeComponent();
}

当您需要属性中的值时,可以使用该引用:

MessageBox.Show(_form1.filePath);

使用属性并将表单引用传递给构造函数的替代方法,您可以将值本身传递给构造函数。但是,如果需要在表单之间传递更多信息,则对表单的引用允许您添加更多属性。