根据文档,当您将图像从一种形式传递到另一种形式时,您应该创建图像的克隆。就像是:
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
onfrmAdd
和picNew
on frmNew
。单击时btnCancel
,代码frmNew
检查是否存在有效frmAdd
实例,如果是,则设置其图像。
请注意,这picAdd
不是公共控制 - 它应该是私有的。在表单中将控件设置为公共不是一个好主意,因为它允许不受控制地访问它们,并且表单不会确定它们的状态(因为其他人可能会在表单不知道的情况下更改这些控件。)这可能会导致变化很大- 修复大型程序中的错误。
如果您需要访问其表单之外的控件,请将控件保留为私有并在表单中创建一个公共属性/方法,以便在必要时更新控件 - 就像上面的SetPicture
方法一样。这仍然允许您从表单外部分配图片,但表单可以控制如何发生,因为SetPicture
可以验证图像等。如果您只是将控件设置为公共,这是不可能的。