【问题标题】:only last dynamically created picturebox is accessible只能访问最后一个动态创建的图片框
【发布时间】:2013-09-18 11:09:28
【问题描述】:

我正在创建一个 win 表单应用程序,其中有一个 tabcontrol1, 并在运行时创建标签页和图片框

按钮上单击 i 创建新标签页和图片框 并将它们添加到 tabcontrol1。

现在我可以更改仅上次创建的图片框的图像... 当我尝试更改除最后一个以外的任何图片框的图像时,我无法做到这一点

这是代码示例

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; 
    }

【问题讨论】:

    标签: c# dynamic this tabcontrol picturebox


    【解决方案1】:

    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;
    

    更新

    如果您在 tabPagetabControl1 中有 tabControl2,试试这个:

    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; 
        }
    }
    

    【讨论】:

    • 我怎样才能真正获得所选标签的子控件我的picturebox1位于标签页中此标签页位于标签控件中,此标签控件位于所选标签页中,例如:-静态tabcontrol1有 tabpage1 有一个 tabcontrol2 有一个 tabpage 2 有一个图片框 1
    • @user2791184 看我的更新,只是和之前的代码有点不同。
    【解决方案2】:

    这是因为您总是在创建一个新的图片框来覆盖变量图片框1,因此失去了对除了最后一个创建的图片框之外的所有图片框的引用。

    如果单击 button2,则必须转到当前活动的选项卡并在选项卡页控件集合中搜索图片框并在那里更改图像。 结果(未优化)应如下所示:

        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; 
            }
    

    【讨论】:

    • 是的,按下按钮 2 时,图像在最后一个图片框上发生了变化,所以我应该怎么做....?我想通过 button2 更改图片框的图像
    • @user2791184 你创建了很多图片框,那么你想在点击button2时改变哪个图片?
    • 我怎样才能真正获得所选标签的子控件我的picturebox1位于标签页中此标签页位于标签控件中,此标签控件位于所选标签页中,例如:-静态tabcontrol1有 tabpage1 有一个 tabcontrol2 有一个 tabpage 2 有一个图片框
    猜你喜欢
    • 2019-06-25
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多