C# 阻止控件继承它';美国父母是残疾人

C# 阻止控件继承它';美国父母是残疾人,c#,winforms,inheritance,C#,Winforms,Inheritance,我知道这似乎是一个奇怪的要求,但我有这个布局。有了它,我非常享受和利用FlowLayoutPanel。我禁用它以禁用所有子控件。但有些情况下,我有一个链接,我想在那里启用所有的时间。这可能吗 flowLayoutPanel1.Enabled = false; // disable panel and all child controls linkLabel1.Enabled = true; // re-enable somehow the link that was disabled inher

我知道这似乎是一个奇怪的要求,但我有这个布局。有了它,我非常享受和利用FlowLayoutPanel。我禁用它以禁用所有子控件。但有些情况下,我有一个链接,我想在那里启用所有的时间。这可能吗

flowLayoutPanel1.Enabled = false; // disable panel and all child controls
linkLabel1.Enabled = true; // re-enable somehow the link that was disabled inherently
我之所以这么问,是因为也许有办法做到这一点,但如果这是一个正式的糟糕设计案例,那么我会重新考虑我的解决方案

之前为了解决这个问题,我覆盖了我想要独立于父控件启用/禁用的控件。我会把它排成一行,并定位控件,使其看起来与组一致。我讨厌这个。它使设计变得困难,因为拖放只是将其放回容器中,而且完全违背了使用FlowLayoutPanel的目的


提前感谢。

使用Anthony的建议。我管理了以下代码,解决了我的困境。使用LINQ!(我总是忘记使用LINQ)我对扩展方法进行了一些调整,并且能够通过一个我不希望禁用的参数数组来敲入控件。至少可以说非常灵活

private void button1_Click(object sender, EventArgs e)
{
    // "reset"
    flowLayoutPanel1.EnableAll();
}

private void button2_Click(object sender, EventArgs e)
{
    // disable but the provide controls
    flowLayoutPanel1.DisableBut(checkBox1);
}

public static class Extensions
{

    public static void EnableAll(this FlowLayoutPanel container)
    {
        foreach (Control control in container.Controls.OfType<Control>())
            control.Enabled = true;
    }

    public static void DisableBut(this FlowLayoutPanel container, params Control[] but)
    {
        foreach (Control control in (container.Controls.OfType<Control>().Where(x => (!but.Contains(x)))))
        {
            control.Enabled = false;
        }
    }

}
private void按钮1\u单击(对象发送者,事件参数e)
{
//“重置”
flowLayoutPanel1.EnableAll();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
//禁用但不提供控件
flowLayoutPanel1.DisableBut(复选框1);
}
公共静态类扩展
{
公共静态void enablell(此FlowLayoutPanel容器)
{
foreach(container.Controls.OfType()中的控件)
control.Enabled=true;
}
公共静态void DisableBut(此FlowLayoutPanel容器,参数控件[]but)
{
foreach(container.Controls.OfType()中的控件,其中(x=>(!but.Contains(xщщ)'))
{
control.Enabled=false;
}
}
}
建议对性能、扩展性等进行调整

public static class Extensions
{

    public static void EnabledBut(this Control container, Boolean enabled, params Control[] but)
    {
        foreach (Control control in (container.Controls.OfType<Control>().Except(but)))
            control.Enabled = enabled;
    }

}
公共静态类扩展
{
公共静态void EnabledBut(此控件容器,已启用布尔值,参数控件[],但)
{
foreach(container.Controls.OfType()中的控件,除了(but)))
control.Enabled=已启用;
}
}

flowLayoutPanel1.Controls中的每个控件。其中(x=>x!=linkLabel1))控件。Enabled=false
太棒了,这是完全可行的。用一个扩展方法包装它,然后开始!我将提供一个解决方案,并举例说明我是如何使用它的。如果您想使扩展方法更简单。。。可扩展的。。。考虑将<代码>容器参数仅为<代码>控件< /代码>,因为任何<代码>控件< /代码>都可以有子控件列表。另外,考虑通过另一个参数传递<>代码>启用/代码>状态,这样您就可以通过相同的扩展方法切换<代码>启用=真< /代码>和<代码>启用= false < /代码>条件。再次感谢@anthony您可以简化您的“in”语句,使用来
控制in(container.Controls.OfType()。除了(but))
,它的执行速度也应该更快。我非常喜欢@ScottChamberlain,从所有诚实的观点来看,它也更加清晰。非常感谢。