C# WinForm遍歷窗體控制元件的3種方法
阿新 • • 發佈:2021-12-01
C# WinForm遍歷窗體控制元件的3種方法
轉 https://www.cnblogs.com/zhaoshujie/p/14638460.html
1.迴圈遍歷
private void GetControls(Control fatherControl)
{
Control.ControlCollection sonControls = fatherControl.Controls;
foreach (Control control in sonControls)
{
listBox1.Items.Add(control.Name);
}
}
結果:能獲取到Panel、GroupBox、TabControl等控制元件
問題:Panel等控制元件上面的子控制元件獲取不到
2.遞迴遍歷
private void GetControls(Control fatherControl)
{
Control.ControlCollection sonControls = fatherControl.Controls;
foreach (Control control in sonControls)
{
listBox1.Items.Add(control.Name);
if (control.Controls != null)
{
GetControls(control);
}
}
}
結果:能獲取到絕大多數控制元件
問題:Timer、ContextMenuStrip等控制元件獲取不到
3.使用反射
private void GetControls(Control fatherControl)
{
System.Reflection.FieldInfo[] fieldInfo = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
for (int i = 0; i < fieldInfo.Length; i++)
{
listBox1.Items.Add(fieldInfo[i].Name);
}
}
結果:所有控制元件都被獲取到了
DevExpress
控制元件無法使用this.Controls
進行遍歷,只能通過反射的方法獲得,如下程式碼:
public void SearchBarManager()
{
Type FormType = this.GetType();
FieldInfo[] fi = FormType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
foreach (FieldInfo info in fi)
{
if (info.FieldType == typeof(DevExpress.XtraBars.BarManager))
{
DevExpress.XtraBars.BarManager bar = (info.GetValue(this)) as DevExpress.XtraBars.BarManager;
foreach (DevExpress.XtraBars.BarItem bi in bar.Items)
{
MessageBox.Show(bi.Name);
}
}
}
}