根据班级删除控件

问题描述 投票:0回答:2

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

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

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

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();
    }
}
c# winforms tablelayoutpanel
2个回答
4
投票

你可以这样做:

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不会将它从控件中删除,它只会让它被处理掉。如果您确实要从Controls对象中删除它们,请执行以下操作:

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

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

这两个都从Controls集合中删除它们并处理它们。


0
投票

在每个控件的类型上使用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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.