.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明确表示,他还需要在子面板中找到它们:记住,一些按钮位于面板内部。