WinForm控件选择器
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控件选择器的更多相关文章
- C# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...
- 在WPF中使用WinForm控件方法
1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2. 在要使用WinForm控 ...
- WPF 调用WinForm控件
WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...
- WinForm控件TreeView 只部分节点显示 CheckBox
WinForm控件TreeView 只部分节点显示 CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...
- Winform控件重写
Winform控件重写 因为最近的项目中越来越多的遇到了比较特殊的一些控件,有时候我们自己封装一下可能更加方便我们的使用,下面是我们项目中用到的,简单做一个记录. TextBox控件重写 主要的控制代 ...
- 通过WinForm控件创建的WPF控件无法输入的问题
今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子 ...
- c#Winform控件总结
1. C# WinForm控件.自定义控件整理(大全) (http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html) 2. c#窗体控件用 ...
- 在WPF中调用Winform控件
最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...
- WinForm控件使用文章收藏整理完成
对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...
随机推荐
- poj 2553 强连通分支与缩点
思路:将所有强连通分支找出来,并进行缩点,然后找其中所有出度为0的连通分支,就是题目要求的. #include<iostream> #include<cstdio> #incl ...
- 自定义表单样式之checkbox和radio
1,起因 最近在工作中要实现自定义式的radio样式,而我们通常使用的时默认的样式,因为自己实在想不到解决的方法,于是开始搜索,最终看到了不错的解决办法,可以完美解决我们遇到的问题. 2,原理 大家都 ...
- jQurey对表单表格的操作及更多应用(方法型)
- Spring(3.2.3) - Beans(7): 延迟实例化
默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...
- 文件流操作(FileStream,StreamReader,StreamWriter)
大文件拷贝: /// <summary> /// 大文件拷贝 /// </summary> /// <param name="sSource"> ...
- MVC5----用户登陆及验证码
随便写写记录一下学习的过程 登陆 Models中添加添加 public class LoginViewModel { [Required(ErrorMessage = "*")] ...
- 第二篇、倾力总结40条常见的移动端Web页面问题解决方案
1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...
- Swift使用闭包表达式
Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in 语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是 ...
- Swift协议(Protocol)
协议是为方法.属性等定义一套规范,没有具体的实现. 协议能够被类.结构体等具体实现(或遵守). protocol SomeProtocol { // protocoldefinition goes h ...
- PHP学习笔记 - 进阶篇(6)
PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...