C# 向winform添加动态控件无效

C# 向winform添加动态控件无效,c#,winforms,picturebox,C#,Winforms,Picturebox,我正在WinForms中创建动态PictureBox和标签。为此,我创建了一个基于给定整数创建这些项的方法。在加载表单时的第一次运行中,它工作平稳,但当我从下拉框中传递任何整数时,它不会进行任何更改。我试着调试代码,所有标签都相应地创建了,但它没有反映在winForm中。我试过使用Invalidate、Update和Refresh,但它们都不起作用 下面是我已经实现的方法 private void createPictureBox(int size) { //this.Controls.

我正在
WinForms
中创建动态
PictureBox
和标签。为此,我创建了一个基于给定整数创建这些项的方法。在加载表单时的第一次运行中,它工作平稳,但当我从下拉框中传递任何整数时,它不会进行任何更改。我试着调试代码,所有标签都相应地创建了,但它没有反映在
winForm
中。我试过使用Invalidate、Update和Refresh,但它们都不起作用

下面是我已经实现的方法

private void createPictureBox(int size)
{
    //this.Controls.Clear();
    panel1.Controls.Clear();
    Label[] ParameterLabel = new Label[size];
    PictureBox[] ParameterBack = new PictureBox[size];
    int y_value = 11;
    this.Refresh();
    for (int i = 0; i < size; ++i)
    {

        ParameterLabel[i] = new Label();
        ParameterLabel[i].Text = "Test Text";
        ParameterLabel[i].Font = new System.Drawing.Font("Calibri", 8, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
        ParameterLabel[i].ForeColor = System.Drawing.Color.White;
        ParameterLabel[i].BackColor = System.Drawing.Color.FromArgb(1, 0, 64);
        ParameterLabel[i].Size = new System.Drawing.Size(145, 20);
        ParameterLabel[i].Location = new Point(30, y_value);
        ParameterLabel[i].Anchor = AnchorStyles.Left;
        ParameterLabel[i].Visible = true;

        ParameterBack[i] = new PictureBox();
        ParameterBack[i].Image = Image.FromFile(STR_SETTING_PATH + "\\" + STR_IDEA_NO_XXXXX + "_01_nv.png");
        ParameterBack[i].Size = new System.Drawing.Size(400, 32);
        ParameterBack[i].Location = new Point(2, y_value - 10);
        ParameterBack[i].Anchor = AnchorStyles.Left;
        ParameterBack[i].Visible = true;
        //this.Controls.Add(ParameterBack[i]);

        y_value += 37;
    }
    panel1.Controls.AddRange(ParameterLabel);
    panel1.Controls.AddRange(ParameterBack);
    panel1.Invalidate();
}
private void createPictureBox(整数大小)
{
//this.Controls.Clear();
panel1.控件。清除();
标签[]参数标签=新标签[尺寸];
PictureBox[]参数back=新PictureBox[size];
int y_值=11;
这个。刷新();
对于(int i=0;i
谁能区分在第一次调用中创建的控件和在其他调用中创建的控件?我对您的功能进行了测试,只是做了一点小小的改动,它似乎工作正常:

int CallIndex = 0; // this is on the form level

    private void button1_Click(object sender, EventArgs e)
    {
        createPictureBox(3);
        CallIndex += 1;
    }

    private void createPictureBox(int size)
    {
    // this has the exact same code as your method (copy-paste into my visual studio), 
    // except this change: 
    // ParameterLabel[i].Text = "Test Text";
    ParameterLabel[i].Text = string.Format("Test {0}", CallIndex); // instead of the row above
    }

我确实删除了以前添加的控件,并添加了新的控件,这显然解决了我的问题。这个问题是由于一个接一个的控制。我首先使用删除了以前创建的控件

this.Controls.Remove(UserControl1);

然后重新创建它的实例,解决了我的问题。

这可能是因为您的y_值在方法中声明,每次调用此方法时,都要将它创建的元素放在上次创建的元素之上。是的,我希望从一开始就像创建新控件一样创建控件。问题是您总是在添加控件-您打算如何删除一些控件?你把图片盒叠在一起。你在哪里取旧的?