0

我无法将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;
    }
}

我希望有人可以帮助我解决这个问题。谢谢。

4

2 回答 2

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;
}
于 2012-10-08T02:20:32.910 回答
2

根据文档,当您将图像从一种形式传递到另一种形式时,您应该创建图像的克隆。就像是:

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控件:picAddonfrmAddpicNewon frmNew。单击时btnCancel,代码frmNew检查是否存在有效frmAdd实例,如果是,则设置其图像。

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

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

于 2012-10-08T01:38:49.900 回答