C# WinForm遍歷窗體控件的3種方法


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);
            }
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM