0

PictureBox2 番目のフォームの画像を、既に開いている最初のフォームに渡すことができません。

私はこのコードを使用しています:

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。したがって、開いているフォームに画像を渡す代わりに、実際には別の別のインスタンスに画像を渡しています。

2 番目のフォームが によって作成された場合frmAdd、参照する 2 番目のフォームにプロパティを追加し、frmAddそのプロパティを使用して画像を設定できます。

次のようなものがあります。

第1形態

// 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

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コントロールが関係しています。がクリックされると、コードは有効なインスタンスがあるかどうかをチェックし、存在する場合はイメージを設定します。picAddfrmAddpicNewfrmNewbtnCancelfrmNewfrmAdd

これはパブリック コントロールではないことに注意しpicAddてください。本来あるべきプライベート コントロールです。フォームでコントロールを public に設定することはお勧めできません。これは、制御されていないアクセスを可能にし、フォームがその状態を確実に認識できないためです (フォームが知らないうちに他の誰かがこれらのコントロールを変更する可能性があるため)。 -大規模なプログラムのエラーを修正します。

フォーム外のコントロールにアクセスする必要がある場合は、コントロールをプライベートのままにして、必要に応じてコントロールを更新するパブリック プロパティ/メソッドをフォームに作成します (上記のSetPictureメソッドのように)。これでも、フォームの外部から画像を割り当てることができますが、画像などを検証できるため、フォームはそれがどのように行われるかを制御SetPictureできます。コントロールをパブリックに設定しただけでは、これは不可能です。

于 2012-10-08T01:38:49.900 に答える