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

  1. /// <summary>
  2. /// WinForm控件选择器
  3. /// </summary>
  4. public static class Selector
  5. {
  6. //内部辅助函数,用于获取指定控件内所有子控件,采用yield return可以减少代码编写量
  7. //由于该函数是延迟加载,如果在实际使用过程中直接返回IEnumerable<Control>可能会产生一些问题
  8. //因此在选择器的公开函数中均返回数组
  9. //另外从常理来说,由于在选择的子控件数量应为固定的,因此没有返回List,而且数组对系统资源的消耗要小于List
  10. static IEnumerable<Control> AllNative(this Control ctrl)
  11. {
  12. foreach (Control c in ctrl.Controls)
  13. {
  14. yield return c;
  15. foreach (Control sub in c.AllNative())
  16. {
  17. yield return sub;
  18. }
  19. }
  20. }
  21. /// <summary>
  22. /// 返回控件中所有子控件
  23. /// </summary>
  24. public static Control[] All(this Control ctrl)
  25. {
  26. return ctrl.AllNative().ToArray();
  27. }
  28. /// <summary>
  29. /// 返回控件中所有符合条件的子控件
  30. /// </summary>
  31. /// <param name="predicate">筛选条件</param>
  32. public static Control[] All(this Control ctrl, Func<Control, bool> predicate)
  33. {
  34. return ctrl.AllNative().Where(predicate).ToArray();
  35. }
  36. /// <summary>
  37. /// 返回控件中所有指定类型的子控件
  38. /// </summary>
  39. /// <typeparam name="T">需要选择的子控件类型</typeparam>
  40. public static T[] All<T>(this Control ctrl)
  41. where T:Control
  42. {
  43. return ctrl.All().OfType<T>().ToArray();
  44. }
  45. /// <summary>
  46. /// 返回控件中所有指定类型且符合条件的子控件
  47. /// </summary>
  48. /// <typeparam name="T">需要选择的子控件类型</typeparam>
  49. /// <param name="predicate">筛选条件</param>
  50. public static T[] All<T>(this Control ctrl, Func<T, bool> predicate)
  51. where T : Control
  52. {
  53. return ctrl.All().OfType<T>().Where(predicate).ToArray();
  54. }
  55. }

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

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

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. foreach (var b in this.All<Button>(b => b.FlatStyle == FlatStyle.Flat))
  4. {
  5. b.BackColor = Color.Red;
  6. }
  7.  
  8. }
  9.  
  10. private void button2_Click(object sender, EventArgs e)
  11. {
  12. foreach (var c in this.groupBox1.All())
  13. {
  14. c.BackColor = Color.Blue;
  15. }
  16.  
  17. }
  18.  
  19. private void button3_Click(object sender, EventArgs e)
  20. {
  21. foreach (var c in this.All())
  22. {
  23. c.Text = "haha";
  24. }
  25. }

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

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

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. poj 3249 拓扑排序 and 动态规划

    思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解. #include<iostream> #include& ...

  2. [Yii2]Unable to verify your data submission(你提交的资料无法被验证)

    Yii2中,使用form提交数据,会提示: [yii\web\HttpException:400] exception 'yii\web\BadRequestHttpException' with m ...

  3. ps,Photoshop

    ps翻转.旋转等操作. 注:截图技巧--鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬.

  4. Linux 命令 - top: 动态显示进程信息

    命令格式 top -hv | -abcHimMsS -d delay -n iterations -p pid [, pid ...] 命令参数 -a 根据内存的使用排序. -b 以批处理模式操作. ...

  5. asp网站发布步骤总结

    1.在VS2012中打开索要发布的网站,初始页可重命名为index.html或default.apx. 2.点击  生成>生成“网站”,然后“发布网站”. 3.进行发布设置: (1 配置文件 ( ...

  6. Cocos2d-x如何控制动作速度

    基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变.但这样的改变速度匀速的.线性的.通过ActionEase及其的派生类和Speed 类我们可以使精灵以非匀速或非线性速度运动,这样看起了效果更 ...

  7. springMVC学习篇 - 搭建环境及关键点

    springMVC是spring家族中一个重要的组件,和struts一样作为一套前台框架被广泛的应用于各种项目. 之前在很多项目组都用到springMVC,只感觉很强大,但是对这套框架的知识了解比较少 ...

  8. sass最佳实践

    sass 变量 可以实现统一的布局,比如统一的内边距,统一的外边距,统一的颜色,统一的字号. 嵌套 可以根据组件的嵌套方式来嵌套css代码,方便收缩,查找.代码结构非常清晰,有利于以组件的方式开发 混 ...

  9. PHP的语言规范

    PHP的语言规范: 1.php中的变量名区分大小写,但是函数名,类名,方法名,不区分大小写,但建议区分大小写 2.php代码必须书写在<?php?>(php标签),开启标记(<?ph ...

  10. Bootstrap学习笔记(二) 表单

    在Bootstrap学习笔记(一) 排版的基础上继续学习Bootstrap的表单,编辑器及head内代码不变. 3-1 基础表单 单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文 ...