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

声明

posted @ 2020-10-25 10:26  易几施  阅读(301)  评论(0)    收藏  举报