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

How do I clear a user control from a winform?

这可能是一个基本问题,但我找不到答案,因为这些术语是通用的。

我正在构建一个 WinForm 应用程序。其目的是在某个芯片中设置内存。我认为组织应用程序的最佳方式是为每种芯片类型设置一个用户控件,派生自通用 parent class。将 children 视为 "iphone," "android" 和 "blackberry," 来自 parent class "phone".

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

问题是,按下按钮后,我看到了两个文本。面板的控件集合只有一个元素,但我看到了来自两个 object 的文本。我尝试过刷新、更新和无效,结果相同。

我需要做什么才能使旧文本 "go away" 所以我唯一看到的是最新的 object?

    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

您的 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();
}

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

知道了。问题来自继承,而不是 window 行为。基 class 中的控件 lblDefault,带有不方便的文本,仍然存在于子 class 中。我必须在基础 class 中创建它 Public 并在子 class 构造函数中删除它:

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

线索是这篇文章和项目: