在我的测试系统中,有一个简单的扩展方法: public static IEnumerable<Control> GetAllControls(this Control startControl) { foreach (Control c in startControl.Controls) { yield return c; foreach (Control x in c.GetAllControls()) yield return x; } }这样,当我需要对某个对象下面所有的TextBox的背景设置为红色,我可能写:
theControl .GetAllControls() .Where(c=> c is TextBox) .Where(c=>{c.BackColor = System.Drawing.Color.Red;}) .Count();这样一句话就可以了。不过,我只会把这类代码用在测试程序的时候。我也不太想说清楚这是为什么,反正这是很霸道的做法,一旦写下了这个逻辑代码那么将来就要一直维护下去,那么你再想精确地控制TextBox个性就自相矛盾自己跟自己吵架了。程序正常运行中我还是倾向于设计时精确地指定各个控件的SkinID(多写一个声明标记并不费事,总比重复代码要省事),然后你的美工(或许就是你自己)可以通过theme来在产品发布时给整个软件换上鲜艳的统一的皮肤。
theControl .GetAllControls() .Where(c=> c is TextBox) .Where(c=>{c.BackColor = System.Drawing.Color.Red; return true;}) .Count();呵呵,少写了 “return true;”就不符合lamda表达式的要求了,lamda表达式都是返回值的。
{
}
else
{
//control is not a ComboBox or control==null
}
另一个,用skin皮肤文件了。这个很好的。可以定义页面上所有 TextBox的样式。
{
foreach (Control c in startControl.Controls)
{
yield return c;
foreach (Control x in c.GetAllControls())
yield return x;
}
}这样,当我需要对某个对象下面所有的TextBox的背景设置为红色,我可能写:
theControl
.GetAllControls()
.Where(c=> c is TextBox)
.Where(c=>{c.BackColor = System.Drawing.Color.Red;})
.Count();这样一句话就可以了。不过,我只会把这类代码用在测试程序的时候。我也不太想说清楚这是为什么,反正这是很霸道的做法,一旦写下了这个逻辑代码那么将来就要一直维护下去,那么你再想精确地控制TextBox个性就自相矛盾自己跟自己吵架了。程序正常运行中我还是倾向于设计时精确地指定各个控件的SkinID(多写一个声明标记并不费事,总比重复代码要省事),然后你的美工(或许就是你自己)可以通过theme来在产品发布时给整个软件换上鲜艳的统一的皮肤。
theControl
.GetAllControls()
.Where(c=> c is TextBox)
.Where(c=>{c.BackColor = System.Drawing.Color.Red; return true;})
.Count();呵呵,少写了 “return true;”就不符合lamda表达式的要求了,lamda表达式都是返回值的。