.net 如何更改窗体中所有按钮的属性?

.net 如何更改窗体中所有按钮的属性?,.net,vb.net,winforms,button,properties,.net,Vb.net,Winforms,Button,Properties,是否可以更改窗体/项目上所有按钮的属性?我想把所有按钮的底色都改成蓝色。请记住,一些按钮位于面板内部。 非常感谢您的帮助:您可以使用这种递归搜索控件的通用扩展方法: public static IEnumerable<T> GetChildControlsRecursive<T>(this Control root) where T : Control { if (root == null) throw new ArgumentNullException("roo

是否可以更改窗体/项目上所有按钮的属性?我想把所有按钮的底色都改成蓝色。请记住,一些按钮位于面板内部。
非常感谢您的帮助:

您可以使用这种递归搜索控件的通用扩展方法:

public static IEnumerable<T> GetChildControlsRecursive<T>(this Control root) where T : Control
{
    if (root == null) throw new ArgumentNullException("root");
    var stack = new Stack<Control>();
    stack.Push(root);
    while (stack.Count > 0)
    {
        Control parent = stack.Pop();
        foreach (Control child in parent.Controls)
        {
            if (child is T)
                yield return (T)child;
            stack.Push(child);
        }
    }
    yield break;
}
编辑我刚刚看到VB.NET标记。也许这对我有帮助。VB.NET没有收益率,所以您可以将其放在C中的扩展库中

下面是一种VB.NET方法,它不使用延迟执行,而是返回一个列表:

Module ControlExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetChildControlsRecursive(Of T As Control)(root As Control) As IEnumerable(Of T)
        If root Is Nothing Then
            Throw New ArgumentNullException("root")
        End If
        Dim controls As New List(Of T)
        Dim stack = New Stack(Of Control)()
        stack.Push(root)
        While stack.Count > 0
            Dim parent As Control = stack.Pop()
            For Each child As Control In parent.Controls
                If TypeOf child Is T Then
                    controls.Add(DirectCast(child, T))
                End If
                stack.Push(child)
            Next
        End While
        Return controls
    End Function
End Module

您可以使用这种递归搜索控件的通用扩展方法:

public static IEnumerable<T> GetChildControlsRecursive<T>(this Control root) where T : Control
{
    if (root == null) throw new ArgumentNullException("root");
    var stack = new Stack<Control>();
    stack.Push(root);
    while (stack.Count > 0)
    {
        Control parent = stack.Pop();
        foreach (Control child in parent.Controls)
        {
            if (child is T)
                yield return (T)child;
            stack.Push(child);
        }
    }
    yield break;
}
编辑我刚刚看到VB.NET标记。也许这对我有帮助。VB.NET没有收益率,所以您可以将其放在C中的扩展库中

下面是一种VB.NET方法,它不使用延迟执行,而是返回一个列表:

Module ControlExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetChildControlsRecursive(Of T As Control)(root As Control) As IEnumerable(Of T)
        If root Is Nothing Then
            Throw New ArgumentNullException("root")
        End If
        Dim controls As New List(Of T)
        Dim stack = New Stack(Of Control)()
        stack.Push(root)
        While stack.Count > 0
            Dim parent As Control = stack.Pop()
            For Each child As Control In parent.Controls
                If TypeOf child Is T Then
                    controls.Add(DirectCast(child, T))
                End If
                stack.Push(child)
            Next
        End While
        Return controls
    End Function
End Module

表单是控件的容器;您有一个属性可供使用,该属性称为窗体对象之外的控件

此属性将列出窗体上的所有控件。然后,您可以简单地使用循环或LINQ检查每个控件,看看它是否属于Button类型,如果是,请将背景色更改为蓝色

下面是一个使用LINQ的简单代码示例,它将捕获窗体上最深一层的所有控件:

Dim buttons = Me.Controls.SelectMany(Function(control) control.Controls).OfType(Of Button)().Union(Me.Controls.OfType(Of Button)())
For Each button As Button In buttons
    button.BackColor = Color.Blue
Next

如果您有一个更复杂的表单,其中嵌套控件位于嵌套控件的内部,则可以看到Tim提供的其他答案或一些联机示例。

该表单是控件的容器;您有一个属性可供使用,该属性称为窗体对象之外的控件

此属性将列出窗体上的所有控件。然后,您可以简单地使用循环或LINQ检查每个控件,看看它是否属于Button类型,如果是,请将背景色更改为蓝色

下面是一个使用LINQ的简单代码示例,它将捕获窗体上最深一层的所有控件:

Dim buttons = Me.Controls.SelectMany(Function(control) control.Controls).OfType(Of Button)().Union(Me.Controls.OfType(Of Button)())
For Each button As Button In buttons
    button.BackColor = Color.Blue
Next

如果您有一个更复杂的表单,表单上的嵌套控件中包含嵌套控件,您可以看到Tim提供的其他答案或一些在线示例。

这是一个漂亮、优雅的解决方案!回答得很好@Tim+1。我已经很长时间没有使用VB.Net了,但它看起来像是添加了关键字,尽管我不确定when@petelids:很高兴知道,但我仍然坚持使用VS2010和.NET4。它是在VS2012中添加的。漂亮、优雅的解决方案!回答得很好@Tim+1。我已经很长时间没有使用VB.Net了,但它看起来像是添加了关键字,尽管我不确定when@petelids:很高兴知道,但我仍然坚持使用VS2010和.NET4。它是在VS2012中添加的。一般来说,我也更喜欢这个解决方案,而不是我的递归方法。我从未在productuon代码中需要此扩展。但OP明确表示,他也需要在子面板中找到它们:请记住,一些按钮位于面板内部。一般来说,我也更喜欢这种解决方案,而不是递归方法。我从未在productuon代码中需要此扩展。但OP明确表示,他还需要在子面板中找到它们:记住,一些按钮位于面板内部。