删除flowlayoutpanel的控件并在C#中重新创建它

时间:2014-05-21 08:01:32

标签: c# controls flowlayoutpanel

我一直在尝试编写代码以在 FlowLayoutPanel中生成图像。
这是我到目前为止所做的,当我第一次点击一个按钮时(通过使用复选框 - 读取要打开的图像数量),当我点击按钮时,它将生成图像在第二次尝试时,它不会更新flowlayoutpanel。

即使我试图删除FlowLayoutPanel中的控件,它仍然没有显示图像的第二次尝试。

这是该方法的代码段:

FlowLayoutPanel fwPanel = null;

private void btnOpenFile_Click(object sender, EventArgs e)
{
    //if there is content inside the flowpanel, dump it
    if (fwPanel != null)
    {
        listOfFile.Clear();
    }

    //create a new FLP
    fwPanel = new FlowLayoutPanel();
    int panelWidth = width * 4 + 50;
    int panelHeight = height * 4 + 50;
    fwPanel.Size = new Size(panelWidth, panelHeight);
    fwPanel.Location = new Point(0, 0);
    this.Controls.Add(fwPanel);

    //each checked item would be stored into an arraylist
    foreach(object itemChecked in clbFile.CheckedItems)
    {
        listOfFile.Add((clbFile.Items.IndexOf(itemChecked)+1).ToString());
    }

    int noOfCheckedFile = listOfFile.Count;
    PictureBox[] listOfPicture = new PictureBox[noOfCheckedFile];
    int positionX = 0, positionY = 0;
    int maxPaddingX = (width * MATRIX_SIZE) - 1;
    int maxPaddingY = (height * MATRIX_SIZE) - 1;

    //dynamically create images.
    for (int i = 0; i < noOfCheckedFile; i++)
    {
        listOfPicture[i] = new PictureBox();
        listOfPicture[i].Image = resizeImage((Image)show_picture(Convert.ToInt32(listOfFile[i])), new Size(width, height));
        listOfPicture[i].Size = new Size(width, height);

        if (positionX > maxPaddingX)
        {
            positionX = 0;
            positionY += height;
        }

        if (positionY > maxPaddingY)
        {
            positionY = 0;
        }

        listOfPicture[i].Location = new Point(positionX,positionY);
        listOfPicture[i].Visible = true;
        fwPanel.Controls.Add(listOfPicture[i]);

        positionX += width;
    }
}


show_picture是一个接受整数并返回位图图像的方法 listOfFile用于跟踪要返回的文件 listOfPicture用于存储每张图片。

我试过替换这行

//if there is content inside the flowpanel, dump it
if (fwPanel != null)
{
    listOfFile.Clear();
}

我已将此行添加到其中,当我再次点击时,所有内容都不见了,但这不是我想要的,因为它不会重新填充FlowLayoutPanel。

if (fwPanel != null)
{
    fwPanel.SuspendLayout();

    if (fwPanel.Controls.Count > 0)
    {
        for (int i = (fwPanel.Controls.Count - 1); i >= 0; i--)
        {
             Control c = fwPanel.Controls[i];
             c.Dispose();
        }
        GC.Collect();
    }

    fwPanel.ResumeLayout();
    listOfFile.Clear();
}

我也试过这个,但是第二次点击,什么都不会发生。

if (fwPanel != null)
{
    List<Control> listControls = fwPanel.Controls.Cast<Control>().ToList();

    foreach (Control control in listControls)
    {
        fwPanel.Controls.Remove(control);
        control.Dispose();
    }

    listOfFile.Clear();
}

我想知道我是否会遗漏任何东西,有人可以告诉我我错过了什么吗?或者指导我做这个的最佳实践。

1 个答案:

答案 0 :(得分:0)

建议,我把创作转移到外面(归功于Sinatr发现它)

FlowLayoutPanel fwPanel = new FlowLayoutPanel();

private void createFLP()
    {
        int panelWidth = width * 4 + 50;
        int panelHeight = height * 4 + 50;
        fwPanel.Size = new Size(panelWidth, panelHeight);
        fwPanel.Location = new Point(0, 0);
        this.Controls.Add(fwPanel);
    }

解决了没有发生的事情。然后使用它来删除控件

if (fwPanel != null)
{
    List<Control> listControls = fwPanel.Controls.Cast<Control>().ToList();

    foreach (Control control in listControls)
    {
        fwPanel.Controls.Remove(control);
        control.Dispose();
    }

    listOfFile.Clear();
}

一切都像魅力一样,希望这个答案能够帮助那些面临同样问题的人。