所以,我这样做,想要变得很酷:
List<CheckButton> cbuttons = new List<CheckButton>(
new CheckButton[] {
cbShowAll,
cbShowApproved,
cbShowNew,
cbShowQC,
cbShowSent });
cbuttons.ForEach(b => b.LookAndFeel.UseDefaultLookAndFeel = false);
有更酷的方法吗?
编辑:
可能会CheckButton
受到影响。每个组可能有多个属性和/或方法调用。
答案 0 :(得分:3)
要使其适用于TextBox
或CheckBox
等许多此类控件,请在表单上创建一个扩展方法,如下所示:
public static class FormExtensions
{
public static void ChangeAll<T>(this Form form, string propName, object value) where T : Control
{
foreach (Control c in form.Controls.OfType<T>())
{
PropertyInfo myPropInfo = typeof(T).GetProperty(propName);
if (myPropInfo != null)
{
myPropInfo.SetValue(c, value, null);
}
}
}
}
我们可以称之为:
this.ChangeAll<CheckBox>("Checked", false);
this.ChangeAll<Button>("Text", "DefaultButtonName");
this.ChangeAll<TextBox>("Text", "DefaultText");
其中this
为Form1 : Form
答案 1 :(得分:2)
除非该列表是动态的,否则“无聊”的方式可能会更有效:
cbShowAll.LookAndFeel.UseDefaultLookAndFeel = false;
cbShowApproved.LookAndFeel.UseDefaultLookAndFeel = false;
cbShowNew.LookAndFeel.UseDefaultLookAndFeel = false;
cbShowQC.LookAndFeel.UseDefaultLookAndFeel = false;
cbShowSent.LookAndFeel.UseDefaultLookAndFeel = false;
除此之外,您可以继承CheckButton
并将其设为默认值。
此外,一般来说,“可读且可能有效”比“酷和幻想”要好得多。
答案 2 :(得分:2)
如果您正在对特定控件子集(而不是所有控件)执行一些一次性初始化,那么您可以创建一个包含该子集的数组,然后枚举该数组:
foreach (CheckButton button in
new[] { cbShowAll, cbShowApproved, cbShowNew, cbShowQC, cbShowSent })
{
button.LookAndFeel.UseDefaultLookAndFeel = false;
}
使用循环可以避免重复代码(如poke的答案)。
注意: Eric Lippert写了blog post来解释为什么他更喜欢foreach
而不是ForEach
。摘录:
[提供ForEach扩展方法]可以让您重写这个非常清晰的代码:
foreach (Foo foo in foos) { statement involving foo; }
进入此代码:
foos.ForEach((Foo foo) => { statement involving foo; });
使用几乎完全相同的字符,顺序略有不同。然而第二个版本更难理解,更难调试,并引入了闭包语义,从而可能以微妙的方式改变对象的生命周期。
此外,并非所有版本的.NET Framework都支持List<T>.ForEach
。例如,如果您正在编写Windows应用商店应用,则需要使用foreach
。
答案 3 :(得分:1)
如果您想要使用表单或控件中的所有CheckBox,那么您就不需要对数组进行硬编码。如果您正在对所有内容进行硬编码,那么我同意poke的回答。
但是,你可能完全是动态的,如果这是你想要在很多地方重用的东西,你可以有一个实用工具方法(或者在InitializeComponents()
方法之后触发的基本形式或控件类中的某些东西)。
如果你想要,你可以这样做:
this.Controls.OfType<CheckBox>()
.ForEach(b => b.LookAndFeel.UseDefaultLookAndFeel = false);
如果您不希望使用每个 CheckBox执行此操作,则可以创建这些类的子类,并在OfType
泛型声明中替换该类名。