我无法将我的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;
}
}
我希望有人可以帮助我。感谢。
答案 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
上的frmAdd
和picNew
上的frmNew
。单击btnCancel
后,frmNew
中的代码会检查是否存在有效的frmAdd
实例,如果是,则会设置其图像。
请注意picAdd
不是公共控件 - 它应该是私有的。在表单中将控件设置为public并不是一个好主意,因为它允许对它们进行不受控制的访问,并且表单不会确定其状态(因为其他人可能会在没有形式知道的情况下更改这些控件。)这可能导致变化很大 - 修复较大程序中的错误。
如果您需要访问其表单之外的控件,请将控件保持为私有,并在必要时更新控件的表单中创建公共属性/方法 - 如上面的SetPicture
方法。这仍然允许您从表单外部分配图片,但表单可以控制如何发生,因为SetPicture
可以验证图像等。如果您只是将控件公开设置,则无法实现。