0

私はtabcontrol1を持ち、実行時に tabpage と pictureboxを作成した勝利フォームアプリケーションを作成しています

ボタンをクリックすると、新しいタブページと画像ボックスを作成し、それらをタブコントロール1に追加します。

今、私は最後に作成された画像ボックスの画像のみを変更できます...そして、最後の画像ボックス以外の画像ボックスの画像を変更しようとすると、それを行うことができません

これはコード例です

button1 は新しいタブページとピクチャボックスを作成します

 private void button1_Click(object sender, EventArgs e)
    {
        TabPage tpgallery = new TabPage();           
        tpgallery.Name = "tpgallery";
        tpgallery.Text = "  Gallery  ";            

        tabControl1.TabPages.Add(tpgallery);           

        picturebox1 = new PictureBox();           

        picturebox1.Name = "picturebox1name";           
        picturebox1.Image = WindowsFormsApplication7.Properties.Resources.logo1;

        tpgallery.Controls.Add(picturebox1);          
    }

button2 はピクチャーボックスの画像を変更します

private void button2_Click(object sender, EventArgs e)
    { 
        picturebox1.Image = WindowsFormsApplication7.Properties.Resources.logo2; 
    }
4

2 に答える 2

0

これは、変数 picturebox1 を上書きする新しいピクチャボックスを常に作成しているため、最後に作成されたピクチャボックスを除くすべてのピクチャボックスへの参照が失われるためです。

button2 をクリックした場合は、現在アクティブなタブに移動し、tabpages コントロール コレクションで画像ボックスを検索して、そこで画像を変更する必要があります。結果 (最適化されていない) は次のようになります。

    private void button2_Click(object sender, EventArgs e)
        { 
            PictureBox pb = null;

            foreach (Control c in tabControl1.SelectedTab.Controls)
                if (c is PictureBox)
                {
                    pb = c as PictureBox;
                    break;
                }

            pb.Image = WindowsFormsApplication7.Properties.Resources.logo2; 
        }
于 2013-09-18T11:23:57.303 に答える
0

pictureBox1最後に作成されたものへの参照を保持します。それが問題です。これを試して:

private void button2_Click(object sender, EventArgs e)
{ 
    PictureBox pb = tabControl1.SelectedTab.Controls.OfType<PictureBox>()
                       .FirstOrDefault(p=>p.Name == "picturebox1name");
    if(pb != null)
     pb.Image = WindowsFormsApplication7.Properties.Resources.logo2; 
}

:このコードを使用してピクチャボックスを取得することもできます:

PictureBox pb = tabControl1.SelectedTab.Controls["picturebox1name"] as PictureBox;

アップデート

tabControl2の一部tabPageがある場合はtabControl1、これを試してください。

private void button2_Click(object sender, EventArgs e)
{ 
    TabControl actualTabControl = tabControl1.SelectedTab.Controls.OfType<TabControl>()
                                             .FirstOrDefault();
    if(actualTabControl != null){
     PictureBox pb = actualTabControl.SelectedTab.Controls["picturebox1name"] as PictureBox;
     if(pb != null)
        pb.Image = WindowsFormsApplication7.Properties.Resources.logo2; 
    }
}
于 2013-09-18T11:24:12.460 に答える