通过C#递归地通知子控件

4

我有一个表单MainForm,它是一个包含许多子控件的Windows Forms表单。我想在MainForm上调用一个函数来通知所有子控件。Windows Forms表单是否提供了这样的功能?我尝试使用更新、刷新和无效化等方法,但没有成功。


1
你的“notify”是什么意思? - H H
4个回答

6
foreach (Control ctrl in this.Controls)
{
    // call whatever you want on ctrl
}

如果您想要访问表单上的所有控件,以及表单上每个控件上的所有控件(以此类推,递归地),请使用像这样的函数:

public void DoSomething(Control.ControlCollection controls)
{
    foreach (Control ctrl in controls)
    {
        // do something to ctrl
        MessageBox.Show(ctrl.Name);
        // recurse through all child controls
        DoSomething(ctrl.Controls);
    }
}

您可以通过最初传递表单的Controls集合来调用它,就像这样:

DoSomething(this.Controls);

我会在接口中实现DoSomething,例如“ICanDoSomething”,并在foreach中证明该接口。因此,您只需为每个控件添加此接口即可。 - Tarion

2
MusiGenesis的答案优雅、简洁,(典型的好方式),非常不错。
但是,为了提供另一种使用Lambda表达式和“Action”进行不同类型递归的替代方案:
Action<Control> traverse = null;

//in a function:
traverse = (ctrl) =>
    {
         ctrl.Enabled = false; //or whatever action you're performing
         traverse = (ctrl2) => ctrl.Controls.GetEnumerator();
    };

//kick off the recursion:
traverse(rootControl);

1

没有,你必须自己编写。

另外一方面 - WPF 有“路由事件”,可以实现这个功能甚至更多。


-2
你需要一个递归方法来完成这个任务(如下),因为控件可以有子控件。
void NotifyChildren( control parent )
{
    if ( parent == null ) return;
    parent.notify();
    foreach( control child in parent.children )
    {
        NotifyChildren( child );
    }
}

正如问题的标题所述,这是C#。 - Muad'Dib
2
WinForms中的控件没有“children”集合。 - MusiGenesis
没有控制类。 - Martin Capodici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接