在WinForm裡,Form.Controls會儲存表單上的控制項。但若表單上有容器(Container)型的控制項時,容器內的控制項並不會儲存在Form.Controls中。
舉例來說,如圖 1所示,假設現在我們在表單上放入一個groupBox,然後再放入splitPanel到groupBox裡,接著再splitPanel2中放入TabControl,然後在TabPage1放入TableLayoutPanel,最後將16個Label放到TableLayoutPanel。 沒錯,我們在表單中放入容器,又在容器中放入更多容器。
現在我們在Form1.cs中撰寫以下程式碼,來測試看看Form.Controls有甚麼東西:
namespace example public partial class Form1 : Form public Form1() InitializeComponent(); Console.WriteLine("===Form.Controls==="); foreach (Control control in this.Controls) Console.WriteLine(control.Name);果不其然,裡面只有groupBox而已,容器內部的控制項不會儲存在Form.Controls裡面。然而,當程序員有需要控制表單上「所有」的控制項時,WinForm沒有設計內建的方法讓程序員使用,只能自行撰寫程式碼來完成了。
我們可以把程式碼修改如下:
namespace example public partial class Form1 : Form public Form1() InitializeComponent(); Console.WriteLine("===Form.Controls==="); foreach (Control control in this.Controls) Console.WriteLine(control.Name); Console.WriteLine("===GetAllControls==="); List AllControls = GetAllControls(this); foreach (Control control in AllControls) Console.WriteLine(control.Name); public static List GetAllControls(Form form) return GetAllControls(ToList(form.Controls)); public static List ToList(Control.ControlCollection controls) List controlList = new List(); foreach (Control control in controls) controlList.Add(control); return controlList; public static List GetAllControls(List inputList) //複製inputList到outputList List outputList = new List(inputList); //取出inputList中的容器 IEnumerable containers = from control in inputList where control is GroupBox | control is TabControl | control is Panel | control is FlowLayoutPanel | control is TableLayoutPanel | control is ContainerControl select control; foreach (Control container in containers) //遞迴加入容器內的容器與控制項 outputList.AddRange(GetAllControls(ToList(container.Controls))); return outputList;
加入了
GetAllControls
方法後,便可以實質上的取得所有表單上的控制項了。在方法中,我們將
Control.ControlCollection
類別轉換成
List<Control>
來操作,透過
LINQ
的查詢,取得表單內的容器,然後遞迴呼叫
GetAllControls
來取得容器內的容器。這樣一來無論表單中容器有幾層我們都可以取得其內部的所有控制項。
※註:在輸出的結果中splitContainer1下面兩行是空白的,那其實是splitPanel1與splitPanel2,它們預設的Name是null,所以沒有印出字串。
近期迴響