[.NET]OfType(Of TResult) 方法

要在某個Container中找到某個物件嗎? 可以透過 OfType 來幫忙哦!

環境:.NET 3.5 (感謝 蹂躪 大大 的提醒)

有時在寫程式時,常常會遇到要找某個Container中的所有Button, CheckBox....等物件。

之前會使用GetType去比較,而在.NET 4中,有個方便的Method,就是使用OfType<TResult>

以下用範例來說明,

在畫面中,我想要依RadioButton所選擇的Color來設定Form上面Button的BackColor,如下圖所示,

image

 

所以,取得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);
}

 

參考資訊

OfType(Of TResult) 方法

C#/.NET Little Wonders: Use Cast() and OfType() to Change Sequence Type

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^