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 );
}
}
onとonの 2 つのPictureBox
コントロールが関係しています。がクリックされると、コードは有効なインスタンスがあるかどうかをチェックし、存在する場合はイメージを設定します。picAdd
frmAdd
picNew
frmNew
btnCancel
frmNew
frmAdd
これはパブリック コントロールではないことに注意しpicAdd
てください。本来あるべきプライベート コントロールです。フォームでコントロールを public に設定することはお勧めできません。これは、制御されていないアクセスを可能にし、フォームがその状態を確実に認識できないためです (フォームが知らないうちに他の誰かがこれらのコントロールを変更する可能性があるため)。 -大規模なプログラムのエラーを修正します。
フォーム外のコントロールにアクセスする必要がある場合は、コントロールをプライベートのままにして、必要に応じてコントロールを更新するパブリック プロパティ/メソッドをフォームに作成します (上記のSetPicture
メソッドのように)。これでも、フォームの外部から画像を割り当てることができますが、画像などを検証できるため、フォームはそれがどのように行われるかを制御SetPicture
できます。コントロールをパブリックに設定しただけでは、これは不可能です。