要在某個Container中找到某個物件嗎? 可以透過 OfType 來幫忙哦!
環境:.NET 3.5 (感謝 蹂躪 大大 的提醒)
有時在寫程式時,常常會遇到要找某個Container中的所有Button, CheckBox....等物件。
之前會使用GetType去比較,而在.NET 4中,有個方便的Method,就是使用OfType<TResult> 。
以下用範例來說明,
在畫面中,我想要依RadioButton所選擇的Color來設定Form上面Button的BackColor,如下圖所示,
所以,取得Form上面的所有Button(button2~button5),或是取得GroupBox中的所有RadioButton,就可以使用 OfType<TResult> ,如下的Code,
private void button1_Click(object sender, EventArgs e)
{
//取得 groupBox1 中的所有 RadioButton
var colorRadios = groupBox1.Controls.OfType<RadioButton>();
var chooseColorRadio = (from r in colorRadios
where r.Checked
select r).SingleOrDefault();
if (chooseColorRadio != null)
{
string colorName = chooseColorRadio.Text;
Color chooseColor = System.Drawing.Color.FromName(colorName);
//取得Form上所有的Button
//如果要的是全部的Button包含其他Container中的,請使用GetAll
//var allButtons = GetAll(this, typeof(Button));
//如果是要某個Container中的所有Button,使用OfType即可
var allButtons = this.Controls.OfType<Button>();
foreach(var b in allButtons){
b.BackColor = chooseColor;
}
}
}
//http://stackoverflow.com/questions/3419159/how-to-get-all-child-controls-of-a-windows-forms-form-of-a-specific-type-button
public IEnumerable<Control> GetAll(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAll(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}
參考資訊
C#/.NET Little Wonders: Use Cast() and OfType() to Change Sequence Type
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^