通过C#递归通知子控件(Recursively notify child controls via

2019-07-17 21:06发布

我有一个表格MainForm这是一个Windows窗体形式包含许多子控件。 我想打电话给一个函数MainForm通知其所有的孩子。 请问Windows窗体形成提供这样做的手段? 我打了更新,刷新并没有成功无效。

Answer 1:

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);


Answer 2:

从MusiGenesis答案是优雅的,(一个好办法典型值),非常干净。

但是,仅仅使用lambda表达式,并针对不同类型的递归的“操作”提供了一种替代方案:

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);


Answer 3:

不,没有。 你必须推出自己的。

在一个侧面说明 - WPF已“路由事件”,这也正是这一点,等等。



Answer 4:

您将需要一个递归的方法来做到这一点(如下),因为控件可以有孩子。

void NotifyChildren( control parent )
{
    if ( parent == null ) return;
    parent.notify();
    foreach( control child in parent.children )
    {
        NotifyChildren( child );
    }
}


文章来源: Recursively notify child controls via C#