我想根据用户权限启用/禁用 Windows 窗体应用程序中的控件。
最初,我想在每个表单类中编写一个方法来检查用户凭据,然后启用/禁用其控件。但后来我意识到我可以(也许)创建一个静态类方法,它将表单作为参数并完成工作。
所以我开始编写它,假设有时我只想启用一两个面板的控件,而不是整个表单。所以,我需要的参数是:
- 不同数量的面板和/或
- 表单类。
我执行此任务的困难在于,我在尝试使面板参数发生变化时遇到错误,并且我不知道如何设置可以采用任何表单类的参数。我所有的表单类显然都继承自 Form 泛型类,但我不知道如何应用它。
这是我得到的:
public static void Enable(TableLayoutPanel[] containers = null)
{
if (MyOF.isEnabled)
{
return;
}
else
{
try
{
foreach (TableLayoutPanel table in containers)
{
foreach (Control control in table.Controls)
{
control.Enabled = false;
}
}
}
catch (NullReferenceException)
{
}
}
}
最佳答案
如果我们记得 Form
类派生自 Control
(间接地,通过派生自 ContainerControl
派生自 ScrollableControl
code>,派生自 Control
),并且 Enabled
属性属于 Control
类,我们可以编写一个方法来启用 任何控件的子控件(包括Form
或TableLayoutPanel
控件),因为Controls
集合也属于Control
类:
public static void EnableChildren(Control control, bool enabled = true)
{
foreach (Control child in control.Controls)
{
child.Enabled = enabled;
}
}
然后,如果我们还希望能够将其与控件集合一起使用(如您的示例中所示),我们可以编写一个采用集合的重载:
public static void EnableChildren(IEnumerable<Control> controls = null,
bool enabled = true)
{
if (controls == null) return;
foreach (var control in controls)
{
EnableChildren(control, enabled);
}
}
现在我们可以将其与 Form
或 TableLayoutPanel
控件集合(或在其 Controls
集合中包含控件的任何控件)一起使用.
使用示例:
var myForm = new Form1();
EnableChildren(this); // 'this' is the current form
EnableChildren(myForm); // a separate instance of a form control
EnableChildren(tableLayoutPanel1, false); // A single TableLayoutPanel control
var tableLayoutPanels = new [] {tableLayoutPanel1, tableLayoutPanel2, tableLayoutPanel3};
EnableChildren(tableLayoutPanels); // An array of tableLayoutPanel controls
关于c# - 具有通用和多个参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61086483/