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

本文关键字:新创建 创建 flowlayoutpanel 控件 删除 | 更新日期: 2023-09-27 18:04:26

我一直在尝试编写代码来生成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用于存储各图像

i tried replace this lines

//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();
}
我想知道我是否错过了什么,有人能告诉我我错过了什么吗?或者指导我做这件事的最佳实践。

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

按照建议,我把创作移到了外面(感谢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);
    }

解决了什么都没发生的部分。然后使用this删除控件

if (fwPanel != null)
{
    List<Control> listControls = fwPanel.Controls.Cast<Control>().ToList();
    foreach (Control control in listControls)
    {
        fwPanel.Controls.Remove(control);
        control.Dispose();
    }
    listOfFile.Clear();
}

一切都很顺利,希望这个答案能帮助到其他也面临同样问题的人。