首页 > 编程语言 > 详细

C#一行代码实现(06)跨线程获取控件值,结合BeginInvoke和EndInvoke使用,以DataGridView为例

时间:2020-10-25 10:54:26      阅读:44      评论:0      收藏:0      [点我收藏+]

主要功能

  • 遍历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;
}

声明

C#一行代码实现(06)跨线程获取控件值,结合BeginInvoke和EndInvoke使用,以DataGridView为例

原文:https://www.cnblogs.com/easynetwork/p/13872377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!