如何更改表单中所有按钮的属性?

Har*_*son 1 .net vb.net properties button winforms

是否可以更改表单/项目上所有按钮的属性?例如,我想将所有按钮的背景颜色更改为蓝色.请记住,有些按钮位于面板内部.任何帮助是极大的赞赏 :)

Tim*_*ter 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

找到所有按钮并设置BackColor:

var allButtons = this.GetChildControlsRecursive<Button>();
foreach (Button btn in allButtons)
    btn.BackColor = Color.Blue;
Run Code Online (Sandbox Code Playgroud)

编辑我刚看到VB.NET标签.也许它无论如何都很有帮助.VB.NET没有yield,所以你可以把它放在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
Run Code Online (Sandbox Code Playgroud)

用法:

Dim allButtons = Me.GetChildControlsRecursive(Of Button)()
For Each btn As Button In allButtons
    btn.BackColor = Color.Blue
Next
Run Code Online (Sandbox Code Playgroud)