jQuery和Css的控件选择器用起来非常畅快,相信用过的人都会有这种感觉,而WinForm则是通过Name来实现窗体中控件的选择,在选择单个控件的时候是很方便,但是当选择具有一类特征的控件时,则显得有些乏力。于是我仿照jQuery和Css来实现了一个WInForm的控件选择器,而且是用扩展方法实现,这样只需要添加一个命名空间就可以方便的使用了。下面是实现的源码及一些简单的示例代码。

 /// <summary>
/// WinForm控件选择器
/// </summary>
public static class Selector
{
//内部辅助函数,用于获取指定控件内所有子控件,采用yield return可以减少代码编写量
//由于该函数是延迟加载,如果在实际使用过程中直接返回IEnumerable<Control>可能会产生一些问题
//因此在选择器的公开函数中均返回数组
//另外从常理来说,由于在选择的子控件数量应为固定的,因此没有返回List,而且数组对系统资源的消耗要小于List
static IEnumerable<Control> AllNative(this Control ctrl)
{
foreach (Control c in ctrl.Controls)
{
yield return c;
foreach (Control sub in c.AllNative())
{
yield return sub;
}
}
}
/// <summary>
/// 返回控件中所有子控件
/// </summary>
public static Control[] All(this Control ctrl)
{
return ctrl.AllNative().ToArray();
}
/// <summary>
/// 返回控件中所有符合条件的子控件
/// </summary>
/// <param name="predicate">筛选条件</param>
public static Control[] All(this Control ctrl, Func<Control, bool> predicate)
{
return ctrl.AllNative().Where(predicate).ToArray();
}
/// <summary>
/// 返回控件中所有指定类型的子控件
/// </summary>
/// <typeparam name="T">需要选择的子控件类型</typeparam>
public static T[] All<T>(this Control ctrl)
where T:Control
{
return ctrl.All().OfType<T>().ToArray();
}
/// <summary>
/// 返回控件中所有指定类型且符合条件的子控件
/// </summary>
/// <typeparam name="T">需要选择的子控件类型</typeparam>
/// <param name="predicate">筛选条件</param>
public static T[] All<T>(this Control ctrl, Func<T, bool> predicate)
where T : Control
{
return ctrl.All().OfType<T>().Where(predicate).ToArray();
}
}

在一个Form中添加若干控件,如下图所示

添加三个按钮事件做测试:

 private void button1_Click(object sender, EventArgs e)
{
foreach (var b in this.All<Button>(b => b.FlatStyle == FlatStyle.Flat))
{
b.BackColor = Color.Red;
} } private void button2_Click(object sender, EventArgs e)
{
foreach (var c in this.groupBox1.All())
{
c.BackColor = Color.Blue;
} } private void button3_Click(object sender, EventArgs e)
{
foreach (var c in this.All())
{
c.Text = "haha";
}
}

下面一次是点击三个按钮之后的效果

从结果来看,代码是按照设计意图来运行的。

WinForm控件选择器的更多相关文章

  1. C# 扩展方法奇思妙用高级篇六:WinForm 控件选择器

    在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...

  2. 在WPF中使用WinForm控件方法

    1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2.      在要使用WinForm控 ...

  3. WPF 调用WinForm控件

    WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...

  4. WinForm控件TreeView 只部分节点显示 CheckBox

    WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...

  5. Winform控件重写

    Winform控件重写 因为最近的项目中越来越多的遇到了比较特殊的一些控件,有时候我们自己封装一下可能更加方便我们的使用,下面是我们项目中用到的,简单做一个记录. TextBox控件重写 主要的控制代 ...

  6. 通过WinForm控件创建的WPF控件无法输入的问题

    今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子 ...

  7. c#Winform控件总结

    1. C# WinForm控件.自定义控件整理(大全) (http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html) 2. c#窗体控件用 ...

  8. 在WPF中调用Winform控件

    最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...

  9. WinForm控件使用文章收藏整理完成

    对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...

随机推荐

  1. HttpClient(4.3.5) - ResponseHandler

    The simplest and the most convenient way to handle responses is by using the ResponseHandler interfa ...

  2. django 学习-7 模型数据操作

    1.首先还是创建办一个项目和一个应用 django.admin.py   startproject    ssj cd  ssj django.admin.py   startapp    sdj 那 ...

  3. Jquery中bind和live的区别

    Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function ...

  4. contentProvider-联系人的CURD

    1.联系人的查找 返回一个ArrayList<HashMap<String,  String>>类型 //通过管理联系人的URI获取游标对象 Cursor cursor= ge ...

  5. sqlsever 关于索引

    索引: 在sqlserver中,存储的单位最小是页,页是不可再分的B树:初衷是减少对磁盘的扫描次数,如果一个表或者索引没有使用B树(对于没有聚集索引的表是使用 Heap 堆进行存储的),那么查找一个数 ...

  6. Struts升级到2.3.15.1抵抗漏洞

    后知后觉,今天才开始修复Struts2的漏洞 详细情形可以参考: http://struts.apache.org/release/2.3.x/docs/security-bulletins.html ...

  7. 本地安装discuz

    出处:http://jingyan.baidu.com/article/b87fe19eb57ff252183568d9.html 网站建目前都很简单,建站容易,管理难,网站做大优化更难.本人有建站经 ...

  8. header函数

    header函数 主要用于对http协议头设置相关信息 设置浏览器显示编码(解决乱码) header("Content-type:text/html;charset=utf-8") ...

  9. spring aop配置文档部分翻译

    欢迎转载交流: http://www.cnblogs.com/shizhongtao/p/3476973.html 下面的文字来自官方文档的翻译,具体事例以后奉上. Advisors "ad ...

  10. 模板与继承之艺术——奇特的递归模板模式(CRTP)

    一.什么是CRTP 奇特的模板递归模式(Curiously Recurring Template Pattern)即将派生类本身作为模板参数传递给基类. template<typename T& ...