根据 Class 删除控件

Delete controls based on their Class

我需要删除 TableLayoutPanel 中的一些控件。下面的代码适用于按钮:

private void RemoveButtons()
{
    for (int i = TablePanel.Controls.Count - 1; i >= 0; i--)
    {
        if (TablePanel.Controls[i] is Button)
            TablePanel.Controls[i].Dispose();
    }
}

但是,在其他情况下我需要删除面板,用户控件等。如何更改上面的代码以一种方法基于控件的Class删除控件?

private void RemoveControls(Type class)
{
    for (int i = TablePanel.Controls.Count - 1; i >= 0; i--)
    {
        if (TablePanel.Controls[i] is class)
            TablePanel.Controls[i].Dispose();
    }
}

对每个控件的类型使用 IsAssignableFrom()

private void RemoveControls(Type type)
{
    for (int i = TablePanel.Controls.Count - 1; i >= 0; i--)
    {
        var controlType = TablePanel.Controls[i].GetType();
        if (type.IsAssignableFrom(controlType))
            TablePanel.Controls[i].Dispose();
    }
}

你可以这样做:

private void RemoveControls<T>() where T : Control
{
    for (int i = TablePanel.Controls.Count - 1; i >= 0; i--)
    {
        if (TablePanel.Controls[i] is T)
            TablePanel.Controls[i].Dispose();
    }
}

然后你会像这样使用它:

RemoveControls<Button>();

RemoveControls<Label>();

但是您需要记住,Dispose-ing 控件不会将其从控件中删除,它只是将其丢弃。如果您真的想从控件对象中删除它们,请执行以下操作:

    private void RemoveControls<T>() where T : Control
    {
        var controlsOfT = TablePanel.Controls.OfType<T>().ToList();

        controlsOfT.ForEach((c) =>
        {
            TablePanel.Controls.Remove(c);
            c.Dispose();
        });
    }

它既将它们从 Controls 集合中移除又将它们丢弃。