将图像从Form2传递到Form1

时间:2012-10-08 01:33:55

标签: c# winforms

我无法将我的PictureBox中的图片以我的第二张形式传递到我已打开的第一张表格中。

我正在使用此代码:

private void btnCancel_Click(object sender, EventArgs e)
{
    var frmAdd = new frmAdd();

    frmAdd.pctImage.Image = pctImage.Image;

    if (btnCancel.Text == "C&OPY")
    {
        this.Close();
        return;
    }
    if (btnCancel.Text == "C&ANCEL")
    {
        this.Close();
        return;
    }
}

我希望有人可以帮助我。感谢。

2 个答案:

答案 0 :(得分:3)

var frmAdd = new frmAdd();

这一行看起来像是在创建第一个表单frmAdd的新实例。因此,不是将图像传递给打开的表单,而是将其实际传递给另一个不同的实例。

如果您的第二个表单由frmAdd创建,则可以将属性添加到引用frmAdd的第二个表单,然后使用该属性设置图像。

你可能会有这样的东西:

第一表格

// Just a way to launch the 2nd form
private void LaunchPictureForm()
{
    frmPicture pictureForm = new frmPicture();
    pictureForm.MyFirstForm = this;
    pictureForm.Show();
}

第二表格

public frmAdd MyFirstForm { get; set; }

private void btnCancel_Click(object sender, EventArgs e)
{
    MyFirstForm.pctImage.Image = pctImage.Image;
}

答案 1 :(得分:2)

根据documentation,您应该在将图像从一种形式传递到另一种形式时创建图像的克隆。类似的东西:

frmAdd.pctImage.Image = pctImage.Image.Clone() as Image;

编辑:正如lumberjack4指出的那样,您还创建了一个新的,不可见的frmAdd,并将您的图像分配给该表单,而不是已经显示的图像。实际上可以正确分配图像(尽管您仍然应该克隆它),但它永远不会在屏幕上显示,因为您的本地frmAdd从未显示过。这里有一些代码可以告诉你如何做到这一点:

frmAdd ---------:

public partial class frmAdd : Form
{
    // Stores a reference to the currently shown frmAdd instance.
    private static frmAdd s_oInstance = null;

    // Returns the reference to the currently shown frmAdd instance
    // or null if frmAdd is not shown. Static, so other forms can
    // access this, even when an instance is not available.
    public static frmAdd Instance
    {
        get
        {
            return ( s_oInstance );
        }
    }

    public frmAdd ()
    {
        InitializeComponent ();
    }

    // Sets the specified picture. This is necessary because picAdd
    // is private and it's not a good idea to make it public.
    public void SetPicture ( Image oImage )
    {
        picAdd.Image = oImage;
    }

    // These event handlers are used to track if an frmAdd instance
    // is available. If yes, they update the private static reference
    // so that the instance is available to other forms.
    private void frmAdd_Load ( object sender, EventArgs e )
    {
        // Form is loaded (not necessarily visible).
        s_oInstance = this;
    }

    private void frmAdd_FormClosed ( object sender, FormClosedEventArgs e )
    {
        // Form has been closed.
        s_oInstance = null;
    }

    // Whatever other code you need
}

在frmNew ---------:

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

    private void btnCancel_Click ( object sender, EventArgs e )
    {
        // Is there an active instance of frmAdd? If yes,
        // call SetPicture() with a copy of the image used by
        // this frmNew.
        frmAdd oFrm = frmAdd.Instance;

        if ( oFrm != null )
            oFrm.SetPicture ( picNew.Image.Clone () as Image );
    }
}

涉及2个PictureBox控件:picAdd上的frmAddpicNew上的frmNew。单击btnCancel后,frmNew中的代码会检查是否存在有效的frmAdd实例,如果是,则会设置其图像。

请注意picAdd不是公共控件 - 它应该是私有的。在表单中将控件设置为public并不是一个好主意,因为它允许对它们进行不受控制的访问,并且表单不会确定其状态(因为其他人可能会在没有形式知道的情况下更改这些控件。)这可能导致变化很大 - 修复较大程序中的错误。

如果您需要访问其表单之外的控件,请将控件保持为私有,并在必要时更新控件的表单中创建公共属性/方法 - 如上面的SetPicture方法。这仍然允许您从表单外部分配图片,但表单可以控制如何发生,因为SetPicture可以验证图像等。如果您只是将控件公开设置,则无法实现。