1. 程式人生 > 實用技巧 >C#一行程式碼實現(07)遍歷視窗所有控制元件,通過類和名稱模糊篩選

C#一行程式碼實現(07)遍歷視窗所有控制元件,通過類和名稱模糊篩選

主要功能

  • 遍歷WinForm視窗指定控制元件的所有子控制元件,通過類和名稱模糊篩選

一行程式碼

var controls = this.ExGetChildControls(new []{typeof(TextBox)},new []{"name"});

程式碼封裝

/// <summary>
///     獲取所有子控制元件
/// </summary>
/// <param name="parentControl">父控制元件</param>
/// <param name="controlTypeFilters">控制元件型別篩選,可用typeof(TextBox)或者control.GetType()獲取Type,為null則匹配全部</param>
/// <param name="controlNameFilters">控制元件名稱篩選,模糊匹配,為null則匹配全部</param>
/// <param name="skipDisabled">是否跳過Disabled控制元件</param>
/// <param name="skipReadOnly">是否跳過ReadOnly控制元件</param>
/// <returns></returns>
public static IList<Control> ExGetChildControls(this Control parentControl, Type[] controlTypeFilters = null, string[] controlNameFilters = null, bool skipDisabled = true, bool skipReadOnly = true)
{
    IList<Control> controlList = new List<Control>();
    var controls = parentControl.Controls;
    foreach (Control item in controls)
    {
        var childControls = ExGetChildControls(item, controlTypeFilters, controlNameFilters,
            skipDisabled, skipReadOnly);
        foreach (var childControl in childControls) controlList.Add(childControl);
        if (controlTypeFilters != null && !controlTypeFilters.Contains(item.GetType())) continue;
        if (controlNameFilters != null && !controlNameFilters.Any(o => item.Name.ToUpper().Contains(o.ToUpper()))) continue;
        if (skipDisabled && !item.Enabled) continue;
        if (skipReadOnly)
            if (item is TextBox textBox)
                if (textBox.ReadOnly)
                    continue;
        ProviderTrace.WriteLineJson(new {item.Name, item.GetType().FullName});
        controlList.Add(item);
    }

    return controlList;
}

宣告