WinForm控件查找奇思

简介:

  最近做WinForm程序,尽搞些动态生成控件的,每次寻找某个空间时总要一大堆代码,简单但是写的多,烦啊。突然想起了Linq里的表达式方式,但是项目用的类库是2.0的。最后仿照Linq用范型写了一个遍历类:减少了一大堆不必要的代码。

代码很简单,就不用解释了,直接贴↑。

 

 
  1. public delegate bool SearchHandler(Control ctrFind);  
  2.     public class WinSearch<T>  
  3.     {  
  4. //ctr:查找起点控件。  
  5.         public static T Search(Control ctr, SearchHandler handler)  
  6.         {  
  7.             if (handler == null)  
  8.                 throw new Exception("Handler must be not null");  
  9.             if (ctr == null)  
  10.                 throw new Exception("Parent Control must be not null");  
  11.             if (!(ctr is Control))  
  12.                 throw new Exception("The fist parameter must be innert from Control");  
  13.             return SearchProxy(ctr, handler);  
  14.         }  
  15.  
  16.         protected static T SearchProxy(Control ctr,SearchHandler handler)  
  17.         {  
  18.             if (ctr.Controls.Count < 1)  
  19.             {  
  20.                 return default(T);  
  21.             }  
  22.             else 
  23.             {  
  24.                 foreach (Control child in ctr.Controls)  
  25.                 {  
  26.                     if (child is T  && handler(child))//注意返回范型类型应是如此才会返回。  
  27.                     {  
  28.                         return (T)(object)child;  
  29.                     }  
  30.                     else 
  31.                     {  
  32.                         foreach (Control ch in child.Controls)  
  33.                         {  
  34.                             object obj = SearchProxy(ch, handler);  
  35.                             if (obj !=null)  
  36.                             {  
  37.                                 return (T)obj;  
  38.                             }  
  39.                         }  
  40.                     }  
  41.                 }  
  42.                 return default(T);  
  43.             }  
  44.         }  
  45.          
  46.               
  47.     }  
  48.     
  49. 测试体:  
  50.    
  51.  private void button1_Click(object sender, EventArgs e)  
  52.         {  
  53.             Button btn = WinSearch<Button>.Search(this, new SearchHandler(mehtod));  
  54.             if (btn != null)  
  55.             {  
  56.                 MessageBox.Show(btn.Text);  
  57.             }  
  58.         }  
  59.         public bool mehtod(Control ctr)  
  60.         {  
  61.             if (ctr.Text =="button2")  
  62.                 return true;  
  63.             return false;  
  64.         }  




 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/833551,如需转载请自行联系原作者

相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
3769 0
Winform控件优化之TabControl控件的使用和常用功能
|
9月前
|
C#
27【C#】WinForm中如何获取一个控件相对于主界面的位置
使用button控件的 PointToScreen 方法和Form控件的 PointToClient 方法来获取button1相对于Form边界的位置。具体步骤如下:
120 0
|
10月前
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
174 0
|
算法
分页控件和几个相关控件的源代码
分页控件的源代码,可能会让有些人失望,因为代码很乱。乱的一个原因呢,可能是没有采用OO的思路吧,因为写控件的时候还一点都不会OO呢,只是一直在用,也就没有作大的重构。有两个分页控件, 一个是通过PostBack来分页的,一个是通过URL来分页的。
765 0
|
C#
WPF 循环显示列表
原文:WPF 循环显示列表 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SANYUNI/article/details/79423707 项目需要类似手机上设置时间的控件,可以一直滚动显示的内容连续的。
1458 0
|
前端开发 C# 容器
WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.
1101 0
|
Android开发
UWP 查找模板中的控件
原文:UWP 查找模板中的控件 这个标题我也不知道咋起,意思说一下你就明白。 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,GridView等。 2.
754 0
|
C#
WPF中获得控件相对于控件的相对位置
原文:WPF中获得控件相对于控件的相对位置 GeneralTransform generalTransform = lstitem.TransformToAncestor(this.BackStack); Point point = generalTransform.
910 0
|
C#
[WPF]获取控件间的相对位置
原文:[WPF]获取控件间的相对位置                   [WPF]获取控件间的相对位置                            周银辉 我们知道WPF有着比较灵活的布局方式,关于某个控件的坐标,Canvas中的元素最简单,我们可以直接通过其GetLeft()与GetTop方法来获取,但其它布局面板中的,以及存在于不同布局面板中的元素中间的相对位置就比较让我们头疼了,其实有简单方法的,不知你有没发现。
1646 0
|
C#
wpf 深度复制控件,打印控件
原文:wpf 深度复制控件,打印控件 ...
1005 0