如何从Winform中清除用户控件?

时间:2018-10-03 19:33:02

标签: c# winforms user-controls

这可能是一个基本问题,但由于术语通用,我找不到答案。

我正在构建WinForm应用程序。其目的是在特定芯片中设置内存。我认为组织应用程序的最佳方法是为每个从通用父类派生的芯片类型提供用户控制。可以将孩子视为源自父类“电话”的“ iphone”,“ android”和“ blackberry”。

VS2017 Designer有一个面板,我希望将控件放置在其中。在启动时,我生成一个基类的对象并将其添加到面板中。当我按下一个按钮时,旧对象将被删除并替换为新对象。每个类只有一个控件,即带有独特文本的标签。

问题是,按下按钮后,我看到了两个文本。面板的Controls集合只有一个元素,但是我看到了两个对象的文本。我尝试使用相同的结果刷新,更新和无效。

要使旧文本“消失”怎么办,所以我唯一看到的就是最新的对象?

    private ChipMemBase ChipMemControl = new ChipMemBase();
    public Form1()
    {
        InitializeComponent();
        //tbFeedback.Text = string.Format(fmtString, 0, 1, 2, 3, 4, 5);
        cbChipName.SelectedIndex = 0;
        tbVersion.Text = Version;
        OriginalWindowColor = tbFeedback.BackColor;
        ShowChipMemControl();
        PrintToFeedback(Version);
    }
    private void ShowChipMemControl()
    {
        var ctl = pnlChipMem.GetChildAtPoint(new Point(5,5));
        if (null != ctl)
        {
            if (ctl != ChipMemControl)
            {
                pnlChipMem.Controls.Remove(ctl);
                ctl.Dispose();
                pnlChipMem.Update();
                Refresh();
            }
        }
        if (null != ChipMemControl)
        {
            pnlChipMem.Controls.Add(ChipMemControl);
        }
    }
    private void btnMakeChipMemory_Click(object sender, EventArgs e)
    {
        ChipMemControl = new ChipMemGen2();
        ShowChipMemControl();
    }

Screenshots before and after clicking Create

2 个答案:

答案 0 :(得分:0)

您的ShowChipMemControl在第5,5点获得控件,并检查它是否是ChipMemControl,然后将其删除。

我猜测它没有被删除的原因是,在第5,5点的控件不是ChipMemControl。

您可以使用:

pnlChipMem.Controls.Clear()

删除所有控件

或者:

ChipMemControl cmc = pnlChipMem.Controls.OfType<ChipMemBase>().FirstOrDefault();
if (cmc != null)
{
    pnlChipMem.Controls.Remove(cmc);
    cmc.Dispose();
}

仅在ChipMemBase面板上删除pnlChipMem的第一个实例。

答案 1 :(得分:0)

知道了。问题出在继承,而不是窗口行为。在基类中的控件lblDefault携带不方便的文本,仍然存在于子类中。我必须在基类中将其设置为Public,然后在子类构造函数中将其删除:

        InitializeComponent();
        Controls.Remove(lblDefault);
        lblDefault.Dispose();
        lblDefault = null;

线索是本文和项目: dynamically-and-remove-a-user-control