是否可以更改表单/项目上所有按钮的属性?例如。我想将所有按钮的背景颜色更改为蓝色。请记住,有些按钮位于面板内部。 非常感谢任何帮助:)
答案 0 :(得分: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;
}
找到所有按钮并设置BackColor
:
var allButtons = this.GetChildControlsRecursive<Button>();
foreach (Button btn in allButtons)
btn.BackColor = Color.Blue;
编辑我刚刚看过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
用法:
Dim allButtons = Me.GetChildControlsRecursive(Of Button)()
For Each btn As Button In allButtons
btn.BackColor = Color.Blue
Next
答案 1 :(得分:1)
表单是控件的容器;你有一个可用的属性叫做Form对象的控件。
此属性将包含表单上所有控件的列表。然后,您可以使用循环或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提供的其他答案,或者一些在线示例。