如何禁用除面板之外的所有表单

How to disable all on the forms except for the panel

除了下面显示的面板,我想禁用所有面板

这个面板的触发是当我点击我的数据网格视图上的编辑按钮时,面板将是可见的。所以基本上面板在默认情况下是不可见的(下面是数据网格中编辑按钮的代码)

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
            e.RowIndex >= 0)
        {

            panel1.Visible = true;
            selectedItenOutputOrderTabGrid.Rows.RemoveAt(selectedItenOutputOrderTabGrid.CurrentRow.Index);

              // HERE I WANT TO ADD A FUNCTION THAT WOULD DISABLE ALL IN THE FORM EXCEPT THE PANEL
        }

    }
foreach (Control child in this.Controls)
{
    if (child != panel1)
        child.Enabled = false;
}

确保您的 panel1 是表格中的直系子级。打开文档大纲 window。你应该看到这样的东西:

或者,制作一个新表格并用ShowDialog()显示。如果你愿意,你可以让它无边界...

要禁用除您的面板 panel1 之外的表单的所有子控件,试试这个:

foreach (var control in Controls.Cast<Control>().Where(ctrl => ctrl.Name != "panel1"))
{
    control.Enabled = false;
}

我对此进行了测试,它禁用了所有其他控件,同时保留 panel1 和其中的控件仍然启用。这是从

修改的代码
foreach (Control c in this.Controls)
{
    c.Enabled = false;
}


panel1.Parent.Parent.Enabled = true;
foreach (Control c in panel1.Parent.Parent.Controls)
{
     c.Enabled = false;
}

panel1.Parent.Enabled = true;
foreach (Control c in panel1.Parent.Controls)
{
     c.Enabled = false;
}

panel1.Enabled = true;

这段代码的作用非常简单:

首先,第一个 foreach 禁用表单中的所有控件,但不禁用表单本身。然后,它启用面板的父项的父项,也就是选项卡控件本身,然后禁用选项卡控件中的所有内容。

然后启用面板所在的标签页,并禁用标签页中的所有其他内容。

最后,它启用面板本身。这不是一段非常优化的代码,但它可以工作。

也就是说,按照上图,tabControl1本身是开启的,但是除了panel1所在的tabPage1之外,tabPage1里面除了panel1之外的其他都是关闭的。

编辑:

要撤销所有其他控件的禁用,只需执行以下操作:

foreach (Control c in this.Controls)
{
    c.Enabled = true;
}

panel1.Enabled = false;
private void ShowFilter(Control parentControl, Control childControl, bool enable)
    {
        foreach (Control control in parentControl.Controls.Cast<Control>().Where(ctrl => ctrl.Name != childControl.Name))
        {
            control.Enabled = !enable;
        }
        childControl.Visible = enable;
    }