c# - 具有通用和多个参数的方法

标签 c# visual-studio methods overloading

我想根据用户权限启用/禁用 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 类,我们可以编写一个方法来启用 任何控件的子控件(包括FormTableLayoutPanel控件),因为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);
    }
}

现在我们可以将其与 FormTableLayoutPanel 控件集合(或在其 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/

相关文章:

c++ - 在 Visual Studio 2010 中编译单个 C++ 文件

c# - 无法使用服务帐户将文件插入 Google 云端硬盘

c# - DataGridView Cascading ComboBox 在第二个组合框中显示黑色背景色

c# - 如果未返回,则在间隔后终止线程

c# - 文件被 Visual Studio 2019 锁定

java - 这个 boolean 值 "(number & 1) == 0"是什么意思?

c# - 如何处理过滤器中发生的异常?

visual-studio - Visual Studio生成事件立即返回

c# - 找不到 'Name' 的定义

java - 为什么getter和setter方法在java中很重要?