如何在一组控件上设置属性

时间:2014-03-16 21:12:39

标签: c# .net

所以,我这样做,想要变得很酷:

List<CheckButton> cbuttons = new List<CheckButton>(
    new CheckButton[] { 
        cbShowAll, 
        cbShowApproved, 
        cbShowNew, 
        cbShowQC, 
        cbShowSent });
cbuttons.ForEach(b => b.LookAndFeel.UseDefaultLookAndFeel = false);

有更酷的方法吗?

编辑:

可能会CheckButton受到影响。每个组可能有多个属性和/或方法调用。

4 个答案:

答案 0 :(得分:3)

要使其适用于TextBoxCheckBox等许多此类控件,请在表单上创建一个扩展方法,如下所示:

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");

其中thisForm1 : 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泛型声明中替换该类名。